如何使用“nodes”命令在SQL XML查询中使用命名空间?

时间:2009-06-11 18:48:03

标签: sql xml xsd xml-namespaces

我正在尝试查询以下XML查询中的字段(实际上是一个Web服务调用):

<soap:Envelope xmlns:xsi="[schema]" xmlns:xsd="[shema]" xmlns:soap="[schema]">
  <soap:Body>
    <RunPackage xmlns="http://tempuri.org/">
      <xmlDoc>
        <Request>
          <SubscriberCode>543253</SubscriberCode>
          <CompanyCode>54325</CompanyCode>
          <BranchName>TestBranchName</BranchName>
          <TempWorksUserName>TempWorksUserName</TempWorksUserName>
[...]

使用以下XML查询:

WITH XMLNAMESPACES('[schema]' AS soap2, DEFAULT '[schema]')

SELECT TransactionID, T2.Loc.query('data(Request/SubscriberCode)') as 'SubscriberCode'
FROM TempWorksRequest
CROSS APPLY RequestXML.nodes('soap2:Envelope/soap2:Body/RunPackage/xmlDoc') as T2(Loc)

它运行但不会返回任何报复!

如果我构建相同的查询但删除名称空间,那么它的工作原理。例如,以下工作正常:

  

&LT; xmlDoc中&GT;   &lt;请求&GT;     &LT; SubscriberCode&GT; 543253&LT; / SubscriberCode&GT;     &LT;企业编码&GT; 54325&LT; /企业编码&GT;     &LT; BRANCHNAME&GT; TestBranchName&LT; / BRANCHNAME&GT;   [...]

SQL查询:

  

- 为MITS定义名称空间,以便我们可以使用MITS名称空间。   WITH XMLNAMESPACES('[schema]'   AS soap2,DEFAULT   '[架构]')

     

SELECT TransactionID,     T2.Loc.query('data(Request / SubscriberCode)')为'SubscriberCode'   来自TempWorksRequest   CROSS将RequestXML.nodes('xmlDoc')应用为T2(Loc)

有什么想法吗?

1 个答案:

答案 0 :(得分:5)

发现问题感谢Mark!必须显式声明命名空间。

新工作查询:

WITH XMLNAMESPACES('[URI1]' AS ns, '[URI2]' AS soap) 

SELECT TransactionID, 
    T2.Loc.query('data(ns:SubscriberCode)') as 'SubscriberCode',
FROM TempWorksRequest
CROSS APPLY RequestXML.nodes('soap:Envelope/soap:Body/ns:RunPackage/ns:xmlDoc/ns:Request') as T2(Loc)