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

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

DDD
发布: 2024-12-31 07:54:09
原创
593 人浏览过

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

处理嵌套 FOR XML PATH 查询中的重复 XML 命名空间

使用 FOR XML PATH 和 WITH XMLNAMESPACES 来定义默认命名空间时,不需要的命名空间声明可以填充使用 FOR 的嵌套查询中的顶级节点

问题:

考虑以下示例:

;WITH XmlNamespaces( default 'uri:animal')
SELECT
    a.c2 AS "@species",
    (SELECT l.c3 AS "text()"
       FROM t2 l WHERE l.c2 = a.c1
       FOR XML PATH('leg'), TYPE) AS "legs"
FROM t1 a
FOR XML PATH('animal'), ROOT('zoo')
登录后复制

在这种情况下,命名空间声明 uri:animal 冗余出现在嵌套查询的腿节点。

可能解决方案:

解决方案 1:使用 FOR XML EXPLICIT

一种方法涉及在后续查询中使用 FOR XML EXPLICIT 来删除不需要的命名空间:

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);

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

此查询使用 xml!1!!xmltext 指令提取根节点的内容,丢弃

解决方案 2:删除 XMLNS 命名空间

另一种方法是从嵌套查询中删除 XMLNS 命名空间声明:

WITH XmlNamespaces( default 'uri:animal')
SELECT
    a.c2 AS "@species",
    (SELECT l.c3 AS "text()"
       FROM t2 l WHERE l.c2 = a.c1
       FOR XML PATH('leg'), REMOVE(NAMESPACES(), 'default'), TYPE) AS "legs"
FROM t1 a
FOR XML PATH('animal'), ROOT('zoo')
登录后复制

结论:

最优解取决于查询的具体要求和复杂性。 FOR XML EXPLICIT 方法提供了更大的灵活性,但对于复杂的查询可能会更加乏味,而删除 XMLNS 命名空间提供了一种更简单的方法。

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

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