我必须使用XPath从XML下面解析oprResult/@code
。
XPath表达式
//*[local-name()='oprResult']/@code
按预期工作,但是
我无法使用name
或local-name
函数,因为'('
')'
在我的解析函数中用作分隔符。
是否可以在没有oprResult
的情况下解析local-name
?
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ChangeResponse xmlns="http://www.example.com" code="0" message="Success">
<oprResult code="0" message="Success"/>
</ChangeResponse>
</soap:Body>
</soap:Envelope>
答案 0 :(得分:3)
是否可以解析没有本地名称的oprResult?
不仅可能选择XML元素而不使用local-name()
,它实际上是首选。
您看到带有
等结构的示例XPath的一个常见原因//*[local-name()='oprResult']
是命名空间声明不是XPath的固有部分;名称空间和名称空间前缀声明在使用XPath库的系统或语言的更大上下文中发生。
如果您无法使系统容忍local-name()
的括号,如果//oprResult/@code
不适合,或者您只是想要正确使用命名空间而不是打败它们,弄清楚如何为ex:
命名空间声明命名空间前缀,例如http://www.example.com
,并在XPath中使用命名空间前缀。请继续阅读......
您没有说出您为XPath使用的语言和/或库,但这里有一些示例可以让您了解要查找的内容......
<强> XSLT:强>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ex="http://www.example.com">
...
Python(LibXML):
my $xc = XML::LibXML::XPathContext->new($xhtml_doc);
$xc->registerNs('soap', 'http://schemas.xmlsoap.org/soap/envelope/');
$xc->registerNs('ex', 'http://www.example.com');
Javas(SAX):
NamespaceSupport support = new NamespaceSupport();
support.pushContext();
support.declarePrefix("soap", "http://schemas.xmlsoap.org/soap/envelope/");
support.declarePrefix("ex", "http://www.example.com");
/soap:Envelope/soap:Body/ex:ChangeResponse/oprResult/@code
*
<子>
...但原因不应该是避免使用括号,因为它们在解析函数中用作分隔符。&#34;首先,如果XPath解析器遇到嵌入式parens的问题,请获取一个新的XPath解析器;如果使用XPath库的工具阻止您使用parens,请获取一个新工具(或深入调查以确保该工具未被使用)。其次,正如@predi在问题评论中所观察到的那样,如果只有一个oprResult
元素并且您的回答足够小以至于您不会注意效率低下,那么在您的情况下,您可以使用没有命名空间的XPath://oprResult/@code
子>