XML + XPATH:有没有办法使用默认命名空间?

3

我有一个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无法直接访问“Data”内容,是这样吗?

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

有什么建议吗?


我自己不使用解析器。它是一个完整的、编译后的应用程序(即黑盒),在一侧接收XML,在另一侧接收XPATH,执行某些操作,获取一个值,并继续使用该值进行工作。 - BlaM
1个回答

8

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/'。


(注:该段内容为关于IT技术中XML命名空间的说明)

我的问题是,我无法使用XPath访问应用程序的程序代码。我只有一个输入框,可以输入XPath字符串。但是你的答案正是我害怕得到的答案... 叹气 - BlaM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接