Sql server 在SQLServer2008R2中使用XMLNS解析XML
我对查询XML数据类型相当陌生。我们从合作伙伴处收到XML,其中一个合作伙伴向我们发送如下XML:Sql server 在SQLServer2008R2中使用XMLNS解析XML,sql-server,xml,tsql,Sql Server,Xml,Tsql,我对查询XML数据类型相当陌生。我们从合作伙伴处收到XML,其中一个合作伙伴向我们发送如下XML: DECLARE @ResultData XML = '<outGoing xmlns="urn:testsystems-com:HH.2015.Services.Telephony.OutGoing"> <customer> <ID>158</ID> </customer> </outGoing>
DECLARE @ResultData XML = '<outGoing xmlns="urn:testsystems-com:HH.2015.Services.Telephony.OutGoing">
<customer>
<ID>158</ID>
</customer>
</outGoing>'
返回NUll,但是如果我手动从XML中删除XMLN,则得到158
我已经用XMLNAMESPACES试验了,看看是否可以使用它,但我显然遗漏了一些东西。由于这些XML将自动进入,我希望能够解析XML,但现在我被卡住了 这应该行得通:
DECLARE @ResultData XML = '<outGoing xmlns="urn:testsystems-com:HH.2015.Services.Telephony.OutGoing">
<customer>
<ID>158</ID>
</customer>
</outGoing>'
;WITH XMLNAMESPACES(DEFAULT 'urn:testsystems-com:HH.2015.Services.Telephony.OutGoing')
SELECT
@ResultData.value('(/outGoing/customer/ID)[1]', 'int')
这将返回158
作为其值
我在XMLNAMESPACES中使用了(默认值…)
,因为这是唯一的XML名称空间,它是在顶级节点上定义的,所以它适用于XML结构中的每个节点。谢谢@Marc!这件事救了我的命,也救了我的理智。因此,即使它是在xml的顶级节点中声明的,它也不会自动应用于结构中的每个其他节点,并且您必须显式声明它?@user3333088:当在节点上定义xml命名空间时,它会“继承”到所有子节点,除非子节点显式定义其他内容。因此,这里所有的XML节点实际上都是定义的XML名称空间的一部分-因为它是在没有显式前缀(xmlns=“…”
)的情况下定义的,所以它会自动应用于所有子节点。
DECLARE @ResultData XML = '<outGoing xmlns="urn:testsystems-com:HH.2015.Services.Telephony.OutGoing">
<customer>
<ID>158</ID>
</customer>
</outGoing>'
;WITH XMLNAMESPACES(DEFAULT 'urn:testsystems-com:HH.2015.Services.Telephony.OutGoing')
SELECT
@ResultData.value('(/outGoing/customer/ID)[1]', 'int')
;WITH XMLNAMESPACES(DEFAULT 'urn:testsystems-com:HH.2015.Services.Telephony.OutGoing')
SELECT
CustomerID = cust.value('(ID)[1]', 'INT')
FROM
@ResultData.nodes('/outGoing/customer') as t(cust)