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

How to extract a LookupCustomerIdResult element value from XML text using t-sql 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

谢谢。

至少有两个问题,第一个 LookupCustomerIdResponse不是根元素所以不能从/LookupCustomerIdResponse开始。这可以通过使用 descendant-or-self 轴 (//) 来解决。

第二个问题是,XML在LookupCustomerIdResponse级别有默认的命名空间声明-没有前缀声明的命名空间。这导致 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