在SQL Server 2008 R2中使用XMLNS解析XML

时间:2014-02-20 17:30:54

标签: 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>'

在这个例子中,我想只从XML中提取ID,但似乎xmlns阻止我在XML中获取任何内容:

SELECT cust.value('(ID)[1]', 'VARCHAR(40)') as 'CustomerID'
FROM    @ResultData.nodes('/outGoing/customer') as t(cust)

返回NUll,但如果我手动从XML中删除XMLNS,我会得到158。

我已经尝试WITH XMLNAMESPACES看看我是否可以使用它,但我显然错过了一些东西。由于这些XML将自动进入,我希望能够解析XML,但是现在我被卡住了。

1 个答案:

答案 0 :(得分:1)

这应该有效:

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)

这将返回158作为其值。

我使用过WITH XMLNAMESPACES(DEFAULT .....),因为这是唯一的XML命名空间,它在顶层节点定义 - 因此它适用于XML结构中的每个节点。