java - 为什么我的 xpath 不起作用?

标签 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:

“前缀:someName”

“。”

但不是:“prefix:someName2”。它返回空值。

我想我还是不太了解 namespace ,但我不明白什么?我试过从我的 xpath 中删除前缀,但没有任何效果。 我还检查了是否为 doc.lookupNamespaceURI(prefix) 的前缀返回了正确的 uri,确实如此。

如有任何帮助,我们将不胜感激。

最佳答案

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

关于java - 为什么我的 xpath 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46970456/

相关文章:

perl - 使用 LibXML 在 perl 中解析 SOAP 响应

xslt - XPath轴与XSLT/Xpath中的位置路径表达式相比,性能更好

Java 线程不会暂停 I/O 操作

xml - 如何替换XPath中的字符实体?

java - Dom4j 规则与所有预期节点不匹配

sql-server - 微软 SQL Server 2005/2008 : XML vs text/varchar data type

Java xpath内存泄漏?

java - 在 JTable 中查找并选择

可预先保留的 Java JVM 最大堆大小

java - Node.js 有状态服务器