如何使用t-sql XQuery从XML文本中提取LookupCustomerIdResult元素值

时间:2015-08-05 23:57:37

标签: sql-server xml xpath xquery

我想从以下XML SOAP 1.1响应中确定LookupCustomerIdResult值:

Declare @ResponseText as Varchar(8000)
SET @ResponseText = '<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <LookupCustomerIdResponse xmlns="http://www.alarm.com/WebServices">
      <LookupCustomerIdResult>54949945</LookupCustomerIdResult>
    </LookupCustomerIdResponse>
  </soap:Body>
</soap:Envelope>'

我试过以下但是我得到了NULL结果:

Declare @XmlResponse as xml
select @XmlResponse = CAST(@ResponseText as xml) 
DECLARE @customerID VARCHAR(500)

SELECT @customerID = @XmlResponse.value
('(/LookupCustomerIdResponse/LookupCustomerIdResult)[1]', 'varchar(550)')

SELECT @customerID

谢谢。

1 个答案:

答案 0 :(得分:1)

至少有两个问题,第一个 LookupCustomerIdResponse不是根元素,因此您无法从/LookupCustomerIdResponse开始。可以使用descendant-or-self轴(//)来修复此问题。

第二个问题是,XML具有在LookupCustomerIdResponse级别声明没有前缀的默认名称空间声明-namespace。这导致LookupCustomerIdResponse和所有后代元素没有显式前缀 - 并且没有本地默认名称空间 - 在同一名称空间中被考虑。您可以使用;WITH XMLNAMESPACES()构造来指定要在以下XPath / XQuery语句中使用的默认命名空间。

;WITH XMLNAMESPACES(default 'http://www.alarm.com/WebServices')
SELECT @customerID = @XmlResponse.value
('(//LookupCustomerIdResponse/LookupCustomerIdResult)[1]', 'varchar(550)')

SELECT @customerID

<强> Sqlfiddle Demo

输出

54949945