我的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,它也不能识别上述任何一个。
任何指针?
答案 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。