我的 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,但它也无法识别上述任何内容。
有什么指点吗?
最佳答案
您的 XPath 没问题。
问题出在你的工具 ( http://www.freeformatter.com/xpath-tester.html ) 上。
请勿使用http://www.freeformatter.com/xpath-tester.html具有默认 namespace 的 XML。这是不合规的。您可以在他们为您的 XML 发布的错误消息中看到这一点:
The default (no prefix) Namespace URI for XPath queries is always '' and it cannot be redefined to '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 .
关于xml - local-name() 在 XPath 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38165363/