首页 >Java >java教程 >使用 XPath 时如何处理具有默认命名空间的 XML 文档?

使用 XPath 时如何处理具有默认命名空间的 XML 文档?

Patricia Arquette
Patricia Arquette原创
2024-10-24 06:23:01932浏览

How to Handle XML Documents with Default Namespace When Using XPath?

在具有默认命名空间的 XML 文档上使用 XPath

处理使用默认命名空间的 XML 文档时,缺少前缀可能会导致XPath 操作具有挑战性。虽然将 namespaceAware 属性设置为 false 似乎是一种解决方案,但它有其局限性。

要有效地操作此类文档,必须考虑以下事项:

使用命名空间上下文

当使用命名空间限定的文档时,可以在 XPath 评估期间使用 NamespaceContext。此上下文允许您指定名称空间 URI 的前缀。虽然上下文中使用的前缀不需要与文档中的前缀匹配,但 XPath 中的片段必须具有相应的前缀。

例如,考虑以下代码:

<code class="java">import javax.xml.namespace.NamespaceContext;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class Demo {

    public static void main(String[] args) {
        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        domFactory.setNamespaceAware(true);
        try {
            DocumentBuilder builder = domFactory.newDocumentBuilder();
            Document dDoc = builder.parse("E:/test.xml");

            XPath xPath = XPathFactory.newInstance().newXPath();
            xPath.setNamespaceContext(new MyNamespaceContext());
            NodeList nl = (NodeList) xPath.evaluate("/ns:root/ns:author", dDoc, XPathConstants.NODESET);
            System.out.println(nl.getLength());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static class MyNamespaceContext implements NamespaceContext {

        public String getNamespaceURI(String prefix) {
            if("ns".equals(prefix)) {
                return "http://www.mydomain.com/schema";
            }
            return null;
        }

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

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

    }

}</code>

注意: XPath 表达式“/ns:root/ns:author”使用与 NamespaceContext 一致的前缀。

替代方法

在某些情况下,以下方法也可能有效:

<code class="java">import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class Demo {

    public static void main(String[] args) {
        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder builder = domFactory.newDocumentBuilder();
            Document dDoc = builder.parse("E:/test.xml");

            XPath xPath = XPathFactory.newInstance().newXPath();
            NodeList nl = (NodeList) xPath.evaluate("/root/author", dDoc, XPathConstants.NODESET);
            System.out.println(nl.getLength());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}</code>

注意:此方法假设文档中的其他位置未使用默认命名空间。

以上是使用 XPath 时如何处理具有默认命名空间的 XML 文档?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn