【问题标题】:local-name() not working in XPathlocal-name() 在 XPath 中不起作用
【发布时间】:2016-07-02 23:34:26
【问题描述】:

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

任何指针?

【问题讨论】:

  • 尝试不同的测试仪。 xpathtester.com/xpath 找到匹配项。
  • 但是,我使用的工具需要 xpath 1.0。指定的 xpath 是 1.0 吗?该工具也不匹配此 xpath。我们可以用其他方式处理吗?
  • 是的,那些 xpath 是 xpath 1.0
  • 好的。我会再试一次。
  • @Alohci - 我试过你建议的工具。但是,它也不匹配这三个中的任何一个?它给出以下错误:ERROR - Seem there is no XPath provided?

标签: xml xpath


【解决方案1】:

你的 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/xpathmost XPath libraries 上定义。

【讨论】:

  • 他们发布的消息没有错误。但是当使用像/*[local-name()='web-app']/*[local-name()='mime-mapping']/*[local-name()='mime-type']这样的xpath时它是无关紧要的
  • @Alohci:他们发布的消息表达了与 OP 的情况相关的重要且不幸的限制。不幸的是,该站点没有提供定义命名空间前缀的方法,以便可以正确编写 XPath 而无需诉诸 local-name()
  • @Alohci:您在评论中发布的替代方案xpathtester.com/xpath 没有遇到同样的问题。 online-toolz.com/tools/xpath-editor.php 至少可以与基于 local-name() 的 XPath 一起使用,就像我遇到的大多数其他 XPath 一样。
  • 谢谢。那是 tcserver xml 文件 (web.xml),我无法控制它。我会试试我的工具有什么问题。可能和测试工具有类似的问题。
  • 知道了。在 SLES 11 SP3 上,我们有 xpath 实用程序。那似乎不支持命名空间uri。 # xpath /usr/lib/vmware-vcops/tomcat-web-app/conf/web.xml "/*[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']" namespace-uri: Function not supported
猜你喜欢
  • 2014-12-07
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
相关资源
最近更新 更多