ホームページ  >  記事  >  Java  >  XPath を使用するときにデフォルトの名前空間で XML ドキュメントを処理するにはどうすればよいですか?

XPath を使用するときにデフォルトの名前空間で XML ドキュメントを処理するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-24 06:23:01838ブラウズ

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 中国語 Web サイトの他の関連記事を参照してください。

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