【问题标题】:Issue with XPath not returning a valueXPath 不返回值的问题
【发布时间】:2015-05-19 13:03:20
【问题描述】:

我对使用 XPath 和 XQuery 还很陌生,我似乎无法弄清楚为什么我无法使用以下 XPath 语句从以下 XML 返回 OrderID:

//OrderID[1]/text()

为什么它没有找到OrderID 或者比使用这个 XPath 更深入?

//soap:Body

这是 XML:

<soap:Envelope xmlns:rest="http://schemas.activebpel.org/REST/2007/12/01/aeREST.xsd"
               xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soap:Body>
      <SubmitOnlineSearchResponse xmlns="http://eservices.diligenz.com/">
         <SubmitOnlineSearchResult>
            <return>
               <orderInfo>
                  <OrderID>75124507</OrderID>
               </orderInfo>
            </return>
         </SubmitOnlineSearchResult>
      </SubmitOnlineSearchResponse>
   </soap:Body>
</soap:Envelope>

【问题讨论】:

  • 为什么不使用 SOAP for SOAP?
  • 我正在使用 Informatica Real Time 获取数据。它不是 SOAP 客户端。

标签: xml xpath xquery


【解决方案1】:

因为OrderIDhttp://eservices.diligenz.com/ 命名空间中。

如果可以修改消息,添加

xmlns:di="http://eservices.diligenz.com/"

soap:Envelope 以及其他命名空间声明并将您的 XPath 更改为

//di:OrderID[1]/text()

如果您无法修改消息,请使用宿主环境的工具将命名空间前缀绑定到命名空间,并将 di 绑定到 http://eservices.diligenz.com/ 以使上述 XPath 工作。

【讨论】:

  • 我无法修改消息,很遗憾。至少我的预感之一是正确的,这可能是因为命名空间的事情。
  • 如果您使用的是 XQuery,您可以声明名称空间和前缀绑定,然后使用它,例如declare namespace di="http://eservices.diligenz.com/"; //di:OrderID[1]/text()。这不需要您修改源 XML。如果你不能声明命名空间,你可以使用//*:OrderID[1]/test()* 表示任何命名空间。
  • @adamretter - “任何命名空间”就像一个冠军。这对这个项目非常有用。
  • @edgel1k 小心点。如果您在不同的命名空间中有多个同名元素,那么您可能会得到比预期更多的结果;声明命名空间是更好的做法!
猜你喜欢
  • 2011-09-05
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多