首頁  >  文章  >  Java  >  使用 XPath 時如何處理具有預設命名空間的 XML 文件?

使用 XPath 時如何處理具有預設命名空間的 XML 文件?

Patricia Arquette
Patricia Arquette原創
2024-10-24 06:23:01833瀏覽

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