首页 > 数据库 > mysql教程 > 如何消除嵌套 FOR XML PATH 查询中的冗余命名空间声明?

如何消除嵌套 FOR XML PATH 查询中的冗余命名空间声明?

Mary-Kate Olsen
发布: 2024-12-31 02:44:09
原创
175 人浏览过

How to Eliminate Redundant Namespace Declarations in Nested FOR XML PATH Queries?

消除嵌套 FOR XML PATH 查询中的冗余命名空间声明

在使用 WITH XMLNAMESPACES 声明默认命名空间的 FOR XML PATH 查询中,常见的是在嵌套查询中遇到重复的命名空间声明。本文解决了这个问题并提供了最佳解决方案。

当子查询使用 FOR XML 并从外部查询继承默认命名空间时,就会出现此问题。这会导致子查询的节点有多个命名空间声明。虽然网上有各种解决方案,但都没有完全解决这个问题。

最佳解决方案

经过大量实验,以下解决方案被认为是最有效的:

DECLARE @Order TABLE (OrderID INT, OrderDate DATETIME)    
DECLARE @OrderDetail TABLE (OrderID INT, ItemID VARCHAR(1), Name VARCHAR(50), Qty INT)    
INSERT @Order VALUES (1, '2010-01-01'), (2, '2010-01-02')    
INSERT @OrderDetail VALUES (1, 'A', 'Drink',  5),
                           (1, 'B', 'Cup',    2),
                           (2, 'A', 'Drink',  2),
                           (2, 'C', 'Straw',  1),
                           (2, 'D', 'Napkin', 1)

-- FOR XML PATH query
DECLARE @xml XML = (SELECT OrderID AS "@OrderID",
                        (SELECT ItemID AS "@ItemID", 
                                Name AS "data()" 
                         FROM @OrderDetail 
                         WHERE OrderID = o.OrderID 
                         FOR XML PATH ('Item'), TYPE)
                    FROM @Order o 
                    FOR XML PATH ('Order'), ROOT('dummyTag'), TYPE)

-- Magic happens here!
SELECT 1 AS Tag
      ,NULL AS Parent
      ,@xml AS [xml!1!!xmltext]
      ,'http://test.com/order' AS [xml!1!xmlns]
FOR XML EXPLICIT
登录后复制

此解决方案利用 FOR XML EXPLICIT 查询来包装 FOR XML PATH 查询结果,有效删除不需要的命名空间声明。

  1. @xml AS [xml!1!!xmltext]:该指令指定要从 FOR XML PATH 结果中提取的 XML 内容,不包括虚拟根节点。
  2. 'http://test.com/order' AS [xml!1!xmlns]:该指令显式设置最外层节点所需的命名空间,消除嵌套中的重复声明

结果

此查询的输出将是:

<xml xmlns="http://test.com/order">
  <Order OrderID="1">
    <Item ItemID="A">Drink</Item>
    <Item ItemID="B">Cup</Item>
  </Order>
  <Order OrderID="2">
    <Item ItemID="A">Drink</Item>
    <Item ItemID="C">Straw</Item>
    <Item ItemID="D">Napkin</Item>
  </Order>
</xml>
登录后复制

命名空间声明现在仅存在于根节点,正如预期的那样。

以上是如何消除嵌套 FOR XML PATH 查询中的冗余命名空间声明?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板