local-name()在XPath中不起作用

时间:2016-07-02 23:34:26

标签: xml xpath

我的XML如下所示:

<?xml version="1.0"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
                             http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <mime-mapping>
        <extension>123</extension>
        <mime-type>application/vnd.lotus-1-2-3</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>3dml</extension>
        <mime-type>text/vnd.in3d.3dml</mime-type>
    </mime-mapping>
</web-app>

如您所见,它具有命名空间,因此默认的xpath(例如/web-app/mime-mapping/mime-type)将无效。

基于我对各种线程的阅读, 我试过了:

/*[local-name()='web-app']/*[local-name()='mime-mapping']/*[local-name()='mime-type']

/*[name()='web-app']/*[name()='mime-mapping']/*[name()='mime-type']

/*[name()='web-app' and namespace-uri()='http://java.sun.com/xml/ns/javaee']/*[name()='mime-mapping' and namespace-uri()='http://java.sun.com/xml/ns/javaee']/*[name()='mime-type' and namespace-uri()='http://java.sun.com/xml/ns/javaee']

但似乎都没有用。我在http://www.freeformatter.com/xpath-tester.html进行测试。此外,我正在我的工具测试,它需要XPath 1.0,它也不能识别上述任何一个。

任何指针?

1 个答案:

答案 0 :(得分:2)

您的XPath很好。

这是你的工具(http://www.freeformatter.com/xpath-tester.html)。

不要将http://www.freeformatter.com/xpath-tester.html与具有默认命名空间的XML一起使用。这是不合规的。您可以在他们为您的XML发布的错误消息中看到这一点:

  

XPath查询的默认(无前缀)命名空间URI始终为''   并且无法将其重新定义为“http://java.sun.com/xml/ns/javaee”。

兼容的XPath处理器将返回

<mime-type xmlns="http://java.sun.com/xml/ns/javaee">application/vnd.lotus-1-2-3</mime-type>
<mime-type xmlns="http://java.sun.com/xml/ns/javaee">text/vnd.in3d.3dml</mime-type>

对于你的XPath,正如预期的那样。

或者,最好是follow best practices并为默认命名空间定义名称空间前缀:

j="http://java.sun.com/xml/ns/javaee"

并在XPath中使用它而不是local-name()

/j:web-app/j:mime-mapping/j:mime-type

正确获得相同的结果而不会偏离命名空间。

不幸的是,您无法在Freeformatter网站上定义名称空间前缀,但您可以http://www.xpathtester.com/xpath以及most XPath libraries