没有命名空间的查询 XML

Muf*_*lix 3 xml sql-server sql-server-2008-r2

我可以查询 XML,它定义了带有公共表表达式的xmlns标记

DECLARE @XML XML

SET @XML = 
'<NodeA xmlns="https://XYZ.xsd">
<NodeB verzePis="">
    <NodeC1 attrA="Hello" />
    <NodeC2 attrA="World" />
  </NodeB>
</NodeA>
'

;WITH XMLNAMESPACES(DEFAULT 'https://XYZ.xsd')

    SELECT
        r.value('fn:local-name(.)', 'nvarchar(50)') as SectionName,
        r.value('@attrA','NVARCHAR(250)') attrA
    FROM    @XML.nodes('/NodeA/NodeB/*') AS t(r);
Run Code Online (Sandbox Code Playgroud)

但是如果源 XML 不包含任何 xmlns 标记呢?如何解决缺少命名空间的问题?

Tom*_*m V 5

您可以删除该WITH XMLNAMESPACES(DEFAULT 'https://XYZ.xsd')部分:

DECLARE @XML XML

SET @XML = 
'<NodeA>
<NodeB verzePis="">
    <NodeC1 attrA="Hello" />
    <NodeC2 attrA="World" />
  </NodeB>
</NodeA>
'

;--WITH XMLNAMESPACES(DEFAULT 'https://XYZ.xsd')

    SELECT
        r.value('fn:local-name(.)', 'nvarchar(50)') as SectionName,
        r.value('@attrA','NVARCHAR(250)') attrA
    FROM    @XML.nodes('/NodeA/NodeB/*') AS t(r);
Run Code Online (Sandbox Code Playgroud)

产生

+-------------+-------+
| SectionName | attrA |
+-------------+-------+
| NodeC1      | Hello |
| NodeC2      | World |
+-------------+-------+
Run Code Online (Sandbox Code Playgroud)

请注意,WITH XMLNAMESPACES不会创建公共表表达式,它只是声明了一个可选的命名空间