我想从以下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
谢谢。
答案 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