XQuery [nodes()]:名称“s”不表示命名空间

时间:2013-11-08 08:45:01

标签: xml sql-server-2008 xquery xquery-sql

我有一个我需要粉碎的xml。但我收到此错误XQuery [nodes()]: The name "s" does not denote a namespace.

我有以下格式的xml

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
   <s:Header>
      <a:Action s:mustUnderstand="1">urn:somename-com:Access.2012.Services.Patient.GetCensus</a:Action>
   </s:Header>
   <s:Body>
      <GetCensusByUnitResponse xmlns="urn:somename-com:Access.2012.Services.Patient">
         <GetCensusByUnitResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <BeddedPatients>
               <BeddedPatient>
                   ...
                   ...
                   ...
         </GetCensusByUnitResult>
      </GetCensusByUnitResponse>
</s:Body>
</s:Envelope>

;with xmlnamespaces('urn:Epic-com:Access.2012.Services.Patient' as ep,
        'http://www.w3.org/2003/05/soap-envelope' as s,
        'http://www.w3.org/2005/08/addressing' as a,
             'http://www.w3.org/2001/XMLSchema-instance' as i)

但是当尝试使用xquery将其粉碎时,它会给我错误。

为了粉碎,我写了以下查询:

select  x.n.value('(ep:AccommodationCode)[1]', 'varchar(128)') as accomdationCode
from @xml.nodes('/s:Envelope/s:Body/ep:GetCensusByUnitReeponse/ep:GetCensusByUnitResult/ep:BeddedPatients/ep:BeddedPatient') x(n)

有人可以告诉我可能有什么问题吗?提前致谢。

2 个答案:

答案 0 :(得分:1)

似乎 Ankur 在他/她的问题正文中添加了正确答案。 T-sql在 select语句之前需要名称空间声明:

WITH XMLNAMESPACES ( <XML namespace declaration item>  [ { , <XML namespace declaration item> }...] )

它仍在MS SQL 2016上运行。

答案 1 :(得分:0)

您需要声明名称空间前缀,以便它们在查询执行上下文中可用(而不仅仅是在文档中)。我不熟悉SQL Server的XQuery执行引擎,但它必须具有一些声明命名空间的工具。您需要找到 - 或 - 您可能会考虑使用本机XML数据库,因此您不需要“粉碎”。