ホームページ  >  記事  >  Java  >  Java を使用して XPath のデフォルトの名前空間を持つ XML ドキュメントを処理する方法

Java を使用して XPath のデフォルトの名前空間を持つ XML ドキュメントを処理する方法

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-24 06:17:01755ブラウズ

How to Process XML Documents with Default Namespaces in XPath using Java

デフォルトの名前空間を持つドキュメントの XPath 処理

デフォルトの名前空間 (接頭辞のないもの) を利用した XML ドキュメントの XPath 処理は、これらと同じ原則に従います。

NamespaceContext と接頭辞の規則

修飾された名前空間を利用するドキュメントの場合、XPath 評価中に NamespaceContext を実装できます。これにより、NamespaceContext の要件に従って XPath フラグメントにプレフィックスを付けることができます。特に、使用されるプレフィックスは、元のドキュメント内で使用されているプレフィックスに準拠する必要はありません。

コードの実装

以下は、このアプローチのコード実装例です。

<code class="java">import java.util.Iterator;
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>

代替アプローチ

さらに、次のコード スニペットは、元のクエリに近い、ただしデフォルトの名前空間を考慮した代替アプローチを提供します。

<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>

以上がJava を使用して XPath のデフォルトの名前空間を持つ XML ドキュメントを処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。