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来获取数据。
有什么建议吗?
答
分配http://somenamespace.com/一个命名空间前缀,说 “高清”,并用它在你的XPath表达式:
/SOAP:信封/ SOAP:身体/ DEF:CreateCIInStockResponse/DEF:数据
如何分配前缀将取决于您的XPath处理器。
更新:替代做法,如果分配的前缀是不是一种选择:
/soap:Envelope/soap:Body/*[local-name()='CreateCIInStockResponse']/*[local-name()='Data']
要绝对确保你访问你所期望的元素,您可以添加命名空间URI()=' http://somenamespace.com/'。
什么是您使用的基础XML解析器? Vtd-xml实际上允许你访问默认的命名空间,因为它没有前缀。 – 2010-08-09 22:16:56
我自己不使用解析器。它是一个完整的,编译好的应用程序(如黑匣子),它将XML用于一边,XPATH用于另一边它执行某些操作,获取值并继续使用该值。 – BlaM 2010-08-11 13:07:41