2012-12-13 98 views
0

嗨,我有以下SQL来尝试解析xml并提取“OrderNumber”。我遇到的问题是这个XML(我无法控制)有一个奇怪的XML命名空间。我只是为了这个例子把它改成了abc.com,但是它是其他的东西。无论如何,当该名称空间存在时,T-SQL将在结果中返回空值。所以它不能很好地与命名空间搭配。如果我手动删除名称空间或者通过T-SQL进行搜索和替换,它就可以正常工作。我想我可以做一个搜索和替换,但该解决方案只是困扰我。想知道是否有其他人对此有更好的解决方法?也许是为什么它不喜欢命名空间的解释?真的很感谢一些建议。谢谢!使用错误的xml命名空间解析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

子节点会继承父级的名称空间,除非自己给定名称空间。您必须使用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可能意味着在您的情况下购买,但在另一种情况下,它可能意味着展示架订单。命名空间为名称提供了更多的唯一性。