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

标签 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,但它也无法识别上述任何内容。

有什么指点吗?

最佳答案

您的 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/

相关文章:

java - jackson XML 2.9.0 : @JacksonXmlElementWrapper not working with @JsonCreator & @JsonProperty constructor

java - 编码(marshal) java.util.Map<String,String>

sql-server - 使用 BCP 创建 XML 文件生成的文件对非 ASCII 字符的编码无效

xml - 字符 # 或 & 允许在 xml 中吗?

xml - 使用正则表达式否定行内的单词

.net - Xpath 和 XmlNameSpace

postgresql - 在 PostgreSQL 中使用 XPath 选择根元素的名称

XSLT:XPath 上下文和文档()

html - 包含具有特定文本的另一个元素的元素的 XPath?

javascript - XSL 模板导致加载速度非常慢