不使用local-name()或name()函数的XPath

时间:2014-10-13 06:07:30

标签: xml xpath xml-namespaces

我必须使用XPath从XML下面解析oprResult/@code。 XPath表达式

//*[local-name()='oprResult']/@code

按预期工作,但是 我无法使用namelocal-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>

1 个答案:

答案 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");

一旦您声明了名称空间前缀,您的XPath就可以是:

/soap:Envelope/soap:Body/ex:ChangeResponse/oprResult/@code

* <子> ...但原因不应该是避免使用括号,因为它们在解析函数中用作分隔符。&#34;首先,如果XPath解析器遇到嵌入式parens的问题,请获取一个新的XPath解析器;如果使用XPath库的工具阻止您使用parens,请获取一个新工具(或深入调查以确保该工具未被使用)。其次,正如@predi在问题评论中所观察到的那样,如果只有一个oprResult元素并且您的回答足够小以至于您不会注意效率低下,那么在您的情况下,您可以使用没有命名空间的XPath://oprResult/@code