【问题标题】:SQL Server : XQUERY namespace parsingSQL Server:XQUERY 命名空间解析
【发布时间】:2016-07-17 06:38:01
【问题描述】:

我有以下 XML:

    declare @xml    xml = '
    <DiscoverResponse xmlns="urn:schemas-microsoft-com:xml-analysis">
      <return>
        <root xmlns="urn:schemas-microsoft-com:xml-analysis:rowset">
          <row>
            <xars:METADATA xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">
              <Server>
                <Name>myName</Name>
              </Server>
            </xars:METADATA>
          </row>
        </root>
       </return>
    </DiscoverResponse>'

我已经能够使用以下查询解析到 标记

    ; WITH XMLNAMESPACES(
        'urn:schemas-microsoft-com:xml-analysis'                        AS ns1,
        'urn:schemas-microsoft-com:xml-analysis:rowset'                 AS ns2
    )
    select 
        t.x.value('ns2:Name[1]','varchar(100)') AS Name
    from @xml.nodes('//ns1:DiscoverResponse/ns1:return/ns2:root/ns2:row') t(x)

我一直在试图弄清楚如何通过 标记进行查询。也就是说,我无法成功构造名称空间声明和路径规范以到达 节点(我正在尝试提取服务器的名称)。我似乎与多余的冒号发生冲突。

提前致谢。

【问题讨论】:

  • 您的 XML 无效(或者发布的 XML 不完整)。 XML 变量声明 + 赋值触发异常:Msg 9459,Level 16,State 1,Line 1。XML 解析:第 6 行,字符 93,未声明的前缀
  • 这个 XML 是如何生成的?现有的答案还不错,但是如果 XML 确实像您发布的那样存在,那么您就有麻烦了...有几个默认命名空间,命名空间 xars 根本没有声明...这是在哪里来自?这一代人在你的控制之下吗?有办法查询这个,但它会很丑而且很慢......
  • 唉,它是 SSAS XMLA 查询的直接输出,所以我无法控制返回的 XML 格式是否正确。

标签: sql-server xml namespaces


【解决方案1】:

你有几个地方出了问题:

  1. xars 命名空间未在 xml 中声明。我相信 xars 的命名空间是“urn:schemas-microsoft-com:xml-analysis:rowset”,您实际上将其作为默认命名空间(形成根目录),但没有明确映射到 xars 前缀。

    李>
  2. xquery 缺少对命名空间“http://schemas.microsoft.com/analysisservices/2003/engine”的引用,该命名空间在 xml 中被设置为来自元数据(包括元数据)的默认命名空间。

首先,我已更改您的示例 xml 以包含 xars 的命名空间:我希望您的实际 xml 已在其他地方声明,因此您可能不需要进行此更改。

declare @xml    xml = N'<DiscoverResponse xmlns="urn:schemas-microsoft-com:xml-analysis">
  <return>
    <root xmlns="urn:schemas-microsoft-com:xml-analysis:rowset">
      <row>
        <xars:METADATA xmlns="http://schemas.microsoft.com/analysisservices/2003/engine" xmlns:xars="urn:schemas-microsoft-com:xml-analysis:rowset">
          <Server>
            <Name>myName</Name>
          </Server>
        </xars:METADATA>
      </row>
    </root>
   </return>
</DiscoverResponse>'

其次,我已将“http://schemas.microsoft.com/analysisservices/2003/engine”(作为 ns3)添加到您的查询中,并更改查询以引用它。

; WITH XMLNAMESPACES(
    'urn:schemas-microsoft-com:xml-analysis'                        AS ns1,
    'urn:schemas-microsoft-com:xml-analysis:rowset'                 AS ns2,
    'http://schemas.microsoft.com/analysisservices/2003/engine'     AS ns3
)
select 
    t.x.value('ns3:Name[1]','varchar(100)') AS Name
from @xml.nodes('//ns1:DiscoverResponse/ns1:return/ns2:root/ns2:row/ns2:METADATA/ns3:Server') t(x)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多