【问题标题】:Why won't my xpath work?为什么我的 xpath 不起作用?
【发布时间】:2017-10-27 08:16:58
【问题描述】:

我有以下 xml:

<?xml version="1.0" encoding="UTF-8"?>
<prefix:someName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:prefix="someUri" xsi:schemaLocation="someLocation.xsd">
        <prefix:someName2>
            ....
        </prefix:someName2>
    </prefix:someName>

我的代码如下所示:

private Node doXpathThingy(Document doc) {
     final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
     dbf.setNamespaceAware(true);

     XPath xPath = XPathFactory.newInstance().newXPath();

     xPath.setNamespaceContext(new NamespaceContext(){
        @Override
        public String getNamespaceURI(String prefix) {
            if (prefix == null) {
                throw new NullPointerException("Null prefix");
            }

            return doc.lookupNamespaceURI(prefix);
        }

        @Override
        public String getPrefix(String namespaceURI) {
            return null;
        }

        @Override
        public Iterator getPrefixes(String namespaceURI) {
            return null;
        }
     });

    try {
        XPathExpression expr = xPath.compile(xpathString);
        return (Node)expr.evaluate(doc, XPathConstants.NODESET);
    } catch (Exception e) {
        ....        }
}

我试图让它与任何有效的 xpath 一起工作。它适用于这些 xpath:

“前缀:someName”

“。”

但不是:“前缀:someName2”。它返回 null。

我想我仍然没有得到关于命名空间的东西,但我不明白什么?我试过从我的 xpath 中省略前缀,但没有任何效果。 我还检查了是否为 doc.lookupNamespaceURI(prefix) 的前缀返回了正确的 uri,并且确实如此。

任何帮助将不胜感激。

【问题讨论】:

    标签: java xml xpath namespaces


    【解决方案1】:

    查询prefix:XXX表示child::prefix:XXX,即查找上下文节点的一个元素子元素,其名称为prefix:XXX。您的上下文节点是树根的文档节点。文档节点有一个名为prefix:someName 的子节点,但它没有一个名为prefix:someName2 的子节点。如果要查找文档节点的孙子节点,请尝试查询 */prefix:someName2

    【讨论】:

    • 非常感谢您的详细解释。我的问题已经解决了。 :)
    【解决方案2】:

    不能说我熟悉 Java 执行 XPath 的方式,但看起来您正在从文档的根目录进行 XPath 查询,所以您看到的是预期的行为。

    尝试在文档中的任何位置查找 someName2

    //prefix:someName2

    或者这个找到它作为 someName2 的孩子

    /prefix:someName/prefix:someName2

    或者这个找到它作为任何根元素的直接子元素

    /*/prefix:someName2

    【讨论】:

    • 谢谢你,这行得通!我认为我的代码有问题,而实际上我对 xpath 语法缺乏了解才是问题所在。
    猜你喜欢
    • 2013-06-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2017-08-22
    • 2015-06-10
    • 1970-01-01
    相关资源
    最近更新 更多