【问题标题】:XML + XPATH: Any way to work with a default Namespace?XML + XPATH:有什么方法可以使用默认命名空间?
【发布时间】:2010-08-09 11:57:19
【问题描述】:

我有一个 XML SOAP 结果:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <CreateCIInStockResponse xmlns="http://somenamespace.com/">
      <CreateCIInStockResult>
        <Status>OK</Status>
        <Data>SOMERESULT</Data>
      </CreateCIInStockResult>
    </CreateCIInStockResponse>
  </soap:Body>
</soap:Envelope>

如您所见,CreateCIInStockResponse 中定义的命名空间使用默认命名空间 - 未定义前缀。

如果我们使用,我可以同时获得 StatusData

/soap:Envelope/soap:Body/node()/node()/node()/text()

我说得对吗,没有办法 - 使用 XPath - 直接访问“数据”的内容?

我的问题是,我既不能修改对网络服务的调用,也不能修改从网络服务返回的结果。我所能做的就是使用 XPath 来获取我的数据。

有什么建议吗?

【问题讨论】:

  • 我自己不使用解析器。它是一个完整的、已编译的应用程序(如在黑盒中),一方面采用 XML,另一方面采用 XPATH。它做一些事情,获取一个值并继续使用该值。

标签: xml xpath xml-namespaces


【解决方案1】:

http://somenamespace.com/ 分配给命名空间前缀,例如“def”,并在您的 XPath 表达式中使用它:

/soap:Envelope/soap:Body/def:CreateCIInStockResponse/def:Data

如何分配前缀取决于您的 XPath 处理器。

更新:如果分配前缀不是一个选项,替代方法:

/soap:Envelope/soap:Body/*[local-name()='CreateCIInStockResponse']/*[local-name()='Data']

为确保您访问的是预期的元素,您也可以添加 namespace-uri() = 'http://somenamespace.com/'。

【讨论】:

  • 我的问题是,我无法使用 XPath 访问应用程序的程序代码。我只有一个输入框,可以在其中输入我的 XPath 字符串。但你的答案正是我害怕得到的答案...... sigh
猜你喜欢
  • 2013-06-23
  • 2010-10-07
  • 2012-12-29
  • 2011-10-09
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
相关资源
最近更新 更多