超级简单:使用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命令。

代码

    它产生:

代码

   注意使用附加的'TYPE’参数。这将确保子查询的结果将返回的是一个XML类型 (作为整个XML类型的结果的一部分),而不是NVARCHAR(MAX)类型。如果您要对整个结果添加外围标签,也是简单的小把戏:

复制代码
SELECT (
    
SELECT  
        customername
    
FROM  
        salesorder 
    
FOR  XML AUTO, TYPE, ELEMENTS
AS  orderrequest  FOR  XML PATH( '' ), TYPE, ELEMENTS
复制代码

    它产生:

复制代码
< orderrequest >
    
< salesorder >
        
< customername > parker </ customername >
    
</ salesorder >
    
< salesorder >
        
< customername > lesley </ customername >
    
</ salesorder >
</ orderrequest >
复制代码

  为什么我们在子查询中不使用FOR XML AUTO?试试,它会产生一个错误。当子查询是查询一个实际的表时,您才能使用FOR XML AUTO(上述显然不是)。

  如果您想对所生产的XML完全控制,子查询是条出路。比方说,我们希望,每个订单,客户的名字和所有的项都属于订单。为此,您使用这样的相关子查询:

复制代码
SELECT
    customername ,
    (
SELECT      *   FROM  item  WHERE  item.ordernumber  =  
       salesorder.ordernumber 
FOR  XML AUTO, TYPE, ELEMENTS)
FROM
    salesorder
FOR  XML AUTO, ELEMENTS
复制代码

  它产生:

代码

    当使用关联子查询,你可以使用规则的FOR XML AUTO, TYPE, ELEMENTS 语句。如果你想要在'items'外围有一个标签,只需在子查询后添加as,例如:

 

  • 代码

      它产生:

    代码

     为什么我们不只是简单的连接item表和order表。这有时会导致不必要的和不可预测的情况,涉及到产生XML布局:

  • 例如:

  • 复制代码
    SELECT
        item.description,
        salesorder.customername
    FROM
        salesorder
    INNER   JOIN  item  ON  item.ordernumber  =  salesorder.ordernumber
    FOR  XML AUTO, ELEMENTS
    复制代码

        会产生这样的垃圾:

    代码
  • 此外,如果使用连接查询,你很难添加一个外围的标签。因此,对于大多数的控制,使用FOR XML AUTO和关联子查询。










本文转自麒麟博客园博客,原文链接:http://www.cnblogs.com/zhuqil/archive/2010/01/28/FORXMLAUTO_Controlling.html,如需转载请自行联系原作者
相关文章
|
XML JSON API
WebApi接口 - 响应输出xml和json
格式化数据这东西,主要看需要的运用场景,今天和大家分享的是webapi格式化数据,这里面的例子主要是输出json和xml的格式数据,测试用例很接近实际常用情况;希望大家喜欢,也希望各位多多扫码支持和点赞谢谢:   .
1242 0
|
XML Java 数据格式
使用dom4j工具:设置输出两种xml格式-紧密型和美观型
今天学习使用不知名大佬的domj4 jar包以及用到的几个其他的包,来简单写一个xml
510 0
使用dom4j工具:设置输出两种xml格式-紧密型和美观型
|
XML JSON Java
Spring Batch输出文本数据 XML数据 JSON数据 数据库
Spring Batch输出文本数据 XML数据 JSON数据 数据库
|
XML JSON 搜索推荐
SpringMVC:多视图[JSP,JSON,Excel,XML]混合输出__Java配置方式
SpringMVC:多视图[JSP,JSON,Excel,XML]混合输出__Java配置方式
|
XML JSON 前端开发
SpringMVC:多视图[JSP,JSON,Excel,XML]混合输出__XML配置方式
SpringMVC:多视图[JSP,JSON,Excel,XML]混合输出__XML配置方式
|
XML JSON C#
C#里XML(JSON)序列化时,自动隐藏值为Null的成员的输出
原文:C#里XML(JSON)序列化时,自动隐藏值为Null的成员的输出 从StackOverflow里找到的答案。发现对最新的Newtownsoft的JSON序列化也同样适用。 https://stackoverflow.
1672 0
|
XML 数据格式
【Tip】如何让引用的dll随附的xml注释文档、pdb调试库等文件不出现在项目输出目录中
原文:【Tip】如何让引用的dll随附的xml注释文档、pdb调试库等文件不出现在项目输出目录中 项目输出目录(bin/debug|release)中经常是这个样子: main.exemain.pdb a.dll a.xml b.dll b.pdb b.xml ... 其中xml是同名dll的注释文档,pdb是调试库。
1028 0