XML + XPATH:使用默认命名空间的任何方式?

问题描述:

我有一个XML SOAP结果:XML + XPATH:使用默认命名空间的任何方式?

<?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定义的命名空间使用默认的命名空间 - 没有定义的前缀。

我能得到这两个状态数据如果我们使用

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

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

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

有什么建议吗?

+0

什么是您使用的基础XML解析器? Vtd-xml实际上允许你访问默认的命名空间,因为它没有前缀。 – 2010-08-09 22:16:56

+0

我自己不使用解析器。它是一个完整的,编译好的应用程序(如黑匣子),它将XML用于一边,XPATH用于另一边它执行某些操作,获取值并继续使用该值。 – BlaM 2010-08-11 13:07:41

分配http://somenamespace.com/一个命名空间前缀,说 “高清”,并用它在你的XPath表达式:

/SOAP:信封/ SOAP:身体/ DEF:CreateCIInStockResponse/DEF:数据

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

更新:替代做法,如果分配的前缀是不是一种选择:

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

要绝对确保你访问你所期望的元素,您可以添加命名空间URI()=' http://somenamespace.com/'。

+0

我的问题是,我无法使用XPath访问应用程序的代码。我只有一个输入框,可以输入我的XPath字符串。但是你的答案正是我害怕得到的答案... *叹息* – BlaM 2010-08-09 12:06:29

+0

好的答案,并且编辑得很好! +1 – 2010-08-09 13:55:23

+0

太棒了,那个作品非常漂亮! – BlaM 2010-08-09 14:35:28