为什么我的xpath不起作用?

时间:2017-10-27 08:16:58

标签: java xml xpath namespaces

我有以下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:

&#34;前缀:someName&#34;

&#34;&#34;

但不是:&#34;前缀:someName2&#34;。它返回null。

我想我还没有得到关于名称空间的内容,但我不明白什么?我试过从我的xpath中省略前缀,但是根本没有任何作用。 我还检查了doc.lookupNamespaceURI(前缀)的前缀是否返回了正确的uri,它是。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

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

尝试在doc

中的任何位置找到someName2

//prefix:someName2

或者这样可以找到someName2的孩子

/prefix:someName/prefix:someName2

或者将其作为任何根元素的直接子元素

/*/prefix:someName2

答案 1 :(得分:2)

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