您好我有以下SQL来尝试解析xml并提取“OrderNumber”。我遇到的问题是这个xml(我无法控制)有一个奇怪的xml命名空间。我只是为了这个例子将它改为abc.com,但它还有别的东西。无论如何,当存在该名称空间时,T-SQL在结果中返回null。所以它与命名空间不能很好地配合。如果我手动删除命名空间或通过T-SQL进行搜索和替换,它就可以正常工作。我想我可以做一个搜索和替换,但该解决方案只是困扰我。想知道是否还有其他人能够更好地解决这个问题吗?也许解释为什么它不喜欢命名空间?非常感谢一些建议。谢谢!
Declare @Transmission xml
set @Transmission = '<Transmission>
<Requests>
<SubmitOrdersRequest>
<Orders>
<Order xmlns="http://www.abc.com">
<OrderNumber>123</OrderNumber>
</Order>
</Orders>
</SubmitOrdersRequest>
</Requests>
</Transmission>'
select @Transmission.value('(Transmission/Requests/SubmitOrdersRequest/Orders/Order/OrderNumber/text())[1]', 'varchar(100)')
答案 0 :(得分:0)
子节点继承父节点的名称空间,除非自己给出了名称空间。您必须使用WITH XMLNAMESPACES
定义名称空间,并使用它们正确限定节点名称。
Declare @Transmission xml
set @Transmission = '<Transmission>
<Requests>
<SubmitOrdersRequest>
<Orders>
<Order xmlns="http://www.abc.com">
<OrderNumber>123</OrderNumber>
</Order>
</Orders>
</SubmitOrdersRequest>
</Requests>
</Transmission>';
with xmlnamespaces('http://www.abc.com' as ns1)
select @Transmission.value('(Transmission/Requests/SubmitOrdersRequest/Orders/ns1:Order/ns1:OrderNumber/text())[1]', 'varchar(100)')
注意:名称空间的原因是名称是上下文的东西。 Order
在您的情况下可能意味着购买,但在另一种情况下,它可能意味着展示机架订单。命名空间使名称更具唯一性。