【问题标题】:Db2 for i XMLTABLE with namespaces issueDb2 for i XMLTABLE 与命名空间问题
【发布时间】:2020-12-15 04:57:24
【问题描述】:

我正在尝试调用返回 xml 的 web 服务,然后将结果输出到表格中。

请注意,下面的示例只是对我正在调用的更简单的 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;  

网络服务调用正常并返回如下内容:

<?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 有问题,但是我尝试了很多不同的东西并且无法让它工作。

任何帮助将不胜感激。

【问题讨论】:

    标签: xml soap db2-400


    【解决方案1】:

    基于您的两个命名空间声明:

    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
    

    【讨论】:

    • 你是冠军。非常感谢!在返回的 xml 中,它与 bb 没有任何关系,所以我不完全理解为什么会这样,但谢谢!
    • @Anson,这是因为默认命名空间xmlns="http://blah.com"需要一个前缀。
    • @Anson,&lt;LoginResult&gt; 元素绑定到该默认命名空间,即使它不显式可见。
    猜你喜欢
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 2013-03-26
    • 2016-05-14
    • 1970-01-01
    相关资源
    最近更新 更多