2012-12-13 97 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可能意味着在您的情況下購買,但在另一種情況下,它可能意味着展示架訂單。命名空間爲名稱提供了更多的唯一性。