如何使用 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
输出:
54949945
我想根据以下 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
输出:
54949945