Я пытаюсь вызвать веб-сервис, который возвращает xml, а затем выводит результат в таблицу.
Обратите внимание, что приведенный ниже пример - это просто вызов более простого веб-сервиса, который я вызываю, но если я смогу заставить его работать, я уверен, что смогу заставить работать более сложный...
SELECT WebServiceResult.*
FROM XMLTABLE(XMLNAMESPACES('http://www.w3.org/2003/05/soap-envelope' as "soap", 'http://blah.com' as "bb"),
'$doc/soap:Envelope'
PASSING
XMLPARSE(DOCUMENT systools.HTTPPOSTCLOB('http://zz01:10000/admin.asmx',
CAST ('<httpHeader>
<header name = "content-type" value = "application/soap+xml"/>
</httpHeader>' AS char(1024)),
CAST('<soap:Envelope xmlns:soap = "http://www.w3.org/2003/05/soap-envelope"
xmlns:bb = "http://blah.com">
<soap:Header/>
<soap:Body>
<bb:Login>
<bb:applicationNameSpace>something</bb:applicationNameSpace>
<bb:loginId>loginId</bb:loginId>
<bb:password>password</bb:password>
</bb:Login>
</soap:Body>
</soap:Envelope>' AS char(1024)))) AS "doc"
COLUMNS
LoginResult varchar(256) PATH '/soap:Body/LoginResponse/LoginResult'
) AS WebServiceResult;
Вызов веб-сервиса в порядке и возвращает что-то вроде:
<?xml version = "1.0" encoding = "utf-8"?>
<soap:Envelope xmlns:soap = "http://www.w3.org/2003/05/soap-envelope" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd = "http://www.w3.org/2001/XMLSchema">
<soap:Body>
<LoginResponse xmlns = "http://blah.com">
<LoginResult>something.cdd3a6cc-8104-37bd-7514-035b50f5b5c6</LoginResult>
</LoginResponse>
</soap:Body>
</soap:Envelope>
Я просто хочу отобразить LoginResult в таблице/столбце, но я продолжаю получать NULL.
Если я закомментирую
COLUMNS
LoginResult varchar(256) PATH '/soap:Body/LoginResponse/LoginResult'
затем я получаю xml, который я вставил выше, поэтому я полагаю, что это просто что-то не так с моим PATH, но я пробовал много разных вещей и не могу заставить его работать.
Любая помощь приветствуется.
На основе ваших двух объявлений пространства имен:
XMLTABLE(XMLNAMESPACES('http://www.w3.org/2003/05/soap-envelope' as "soap", 'http://blah.com' as "bb")
И XML
<?xml version = "1.0" encoding = "utf-8"?>
<soap:Envelope xmlns:soap = "http://www.w3.org/2003/05/soap-envelope" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd = "http://www.w3.org/2001/XMLSchema">
<soap:Body>
<LoginResponse xmlns = "http://blah.com">
<LoginResult>something.cdd3a6cc-8104-37bd-7514-035b50f5b5c6</LoginResult>
</LoginResponse>
</soap:Body>
</soap:Envelope>
Пожалуйста, попробуйте следующее выражение XPath:
/soap:Envelope/soap:Body/bb:LoginResponse/bb:LoginResult
Или с помощью пространства имен с подстановочными знаками
/soap:Envelope/soap:Body/*:LoginResponse/*:LoginResult
@ Anson, это потому, что для пространства имен по умолчанию xmlns = "http://blah.com"
нужен префикс.
@Anson, и элемент <LoginResult>
привязан к этому пространству имен по умолчанию, даже если он явно не виден.
Вы чемпион. Большое спасибо! В возвращенном xml это не имело никакого отношения к bb, поэтому я не совсем понимаю, почему это работает, но спасибо!