java - 为什么 XPath namespace-uri() 不能在 Java 中开箱即用?

原文 标签 java xml xpath

我正在尝试使用 namespace-uri() XPath 中的函数以根据节点的完全限定名称检索节点。查询//*[local-name() = 'customerName' and namespace-uri() = 'http://example.com/officeN']this online XPath tester等,正确返回相关节点。然而,以下自包含的 Java 类不检索任何内容。我做错了什么 namespace-uri() ?

import java.io.StringReader;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
public class Test{
    public static void main(String[] args)throws Exception {

        XPathExpression expr = XPathFactory.newInstance().newXPath().compile(
                "//*[local-name() = 'customerName' and namespace-uri() = 'http://example.com/officeN']");
        String xml=
            "<Agents xmlns:n=\"http://example.com/officeN\">\n"+
            "\t<n:Agent>\n\t\t<n:customerName>Joe Shmo</n:customerName>\n\t</n:Agent>\n"+
            "\t<n:Agent>\n\t\t<n:customerName>Mary Brown</n:customerName>\n\t</n:Agent>\n</Agents>";
        System.out.println(xml);
        Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(xml)));
        NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
        System.err.println("\n\nNodes:");
        for (int i = 0; i < nodes.getLength(); i++) {
            System.err.println(nodes.item(i));

        }
    }
}

最佳答案

查询看起来不错。您还需要将 DocumentBuilderFactory 声明为“命名空间感知”。

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.newDocumentBuilder().parse(new InputSource(new StringReader(xml)));

关于java - 为什么 XPath namespace-uri() 不能在 Java 中开箱即用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7138632/

相关文章:

XML 站点地图 - 是否有充分的理由来创建和管理 XML 站点地图?

xml - 将顺序更改为选择

javascript - 使用 XPath 获取属性名称以特定字符串开头的元素列表

java - Ant :将源目录分为两个 jar

java - java.awt.HeadlessException-没有设置X11 DISPLAY变量,但是该程序执行了需要它的操作

java - 使用 XSLT 复制 XML 时绕过 namespace

java - 通过Commons Configuration获取特定的XML子值

java - InvalidArgumentException: invalid argument and InvalidSelectorException: invalid selector error with ChromeDriver and Chrome using Selenium with Java

java - Java HashMap哈希函数

java - Netty 服务器如何将数据发送到不同的客户端?