.Net中将数据库结果转换为XML格式数据 —— 使用FOR XML AUTO控制XML输出

sql2005可以直接输出xml 查询结果返回一个xml字符串
在查询语句的末尾加上
FOR XML AUTO,TYPE
例如: select * from table 1 FOR XML AUTO,TYPE

然后用这句sql查询返回一个xml的string,用webservice直接让flash调用方法就好了

另 dataset 可以直接生成xml字符串,很方便
例如:DataSet ds=new DataSet();
string strXML=ds.GetXml();
就是多了一个中间环节,效率不高。
 

使用FOR XML AUTO控制XML输出

这篇文章描述如何通过使用FOR XML AUTO更好的控制XML输出格式。例如添加XML标记。用这个来替代难于理解的FOR XML EXPLICIT 语句。如果你在应用程序中即将反序列化输出的XML,你就会觉得这个信息对你有用。

在For XML从句中,您通常使用下列方式之一:

RAW

AUTO

EXPLICIT

PATH

如果你想完全掌控产生的XML,可以使用FOR XML EXPLICIT。但是它理解起来相当的困难,后面还要维护复杂的select语句。FOR XML AUTO能产生最可读的SELECT语句,但是它也有缺点,不容易控制生成的XML。但使用一些技巧,例如通过使用额外的PATH选项,你可以做一些超过你预期的事情。RAW选项是很少使用,因此不讨论。PATH 选项允许您很容易地混合属性和元素。现在,让我们来使用FOR XML AUTO

在这个例子中,我们使用的是1:N关系的两个简单的数据表。一个表(SalesOrder)包含客户信息的订单,例外一张表(Items)中包含的具体的项。一个订单可以有多个项,一个项往往只属于一个订单。

以最容易的开始。

SELECT * FROM salesorder

产生:

ordernumber customername customerstreet
——— ———— ————–
1 parker first av
2 lesley sec av

如果你想要使结果集是XML,我们添加FOR XML AUTO 语句:

SELECT * FROM salesorder FOR XML AUTO

它产生:

<salesorder ordernumber=”1″ customername=”parker” customerstreet=”first av”/>
<salesorder ordernumber=”2″ customername=”lesley” customerstreet=”sec av”/>

现在,字段是作属性的,大多数情况下希望他们是元素。为了做到这点,添加ELEMENTS 参数

SELECT * FROM salesorder FOR XML AUTO, ELEMENTS

它产生:

<salesorder>
<ordernumber>1</ordernumber>
<customername>parker</customername>
</salesorder>

如果你想要更改’salesorder‘ 标签,使用:

SELECT * FROM salesorder AS niceorder FOR XML AUTO, ELEMENTS

它产生:

<niceorder>
<ordernumber>1</ordernumber>
<customername>parker</customername>
</niceorder>

当然,这一招也适用的列名:

SELECT ordernumber AS order_no FROM salesorder WHERE ordernumber = 1 FOR XML AUTO, ELEMENTS

它产生:

<salesorder>
<order_no>1</order_no >
</salesorder>

如果你想添加其他标签或节点?例如,对有关客户信息添加’customer”标记?但对FOR XML AUTO来说,被证明是很困难的事件。一个可能的解决方案是使用SELF JOIN (join相同的表),但我找到一个更容易办法。经过一番摆弄和修订,我们使用子查询和有点滥用FOR XML PATH命令。

代码

SELECT
ordernumber,
(
SELECT customername ,
customerstreet
FOR XML PATH(),
TYPE, ELEMENTS)
as customer
FROM
salesorder
FOR XML AUTO, ELEMENTS

它产生: