Db2 for i XMLTABLE 存在命名空间问题
Db2 for i XMLTABLE with namespaces issue
我正在尝试调用 returns xml 的网络服务,然后将结果输出到 table.
请注意,下面的示例只是对我正在调用的更简单的 Web 服务的调用,但是如果我能让这个服务正常工作,我相信我能让更复杂的服务正常工作...
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;
网络服务调用正常,returns类似:
<?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>
我只想在 table/column 中显示 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
我正在尝试调用 returns xml 的网络服务,然后将结果输出到 table.
请注意,下面的示例只是对我正在调用的更简单的 Web 服务的调用,但是如果我能让这个服务正常工作,我相信我能让更复杂的服务正常工作...
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;
网络服务调用正常,returns类似:
<?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>
我只想在 table/column 中显示 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