ホームページ  >  記事  >  Java  >  デフォルトの名前空間を持つ XML ドキュメントで XPath を使用するのはどのような場合ですか?

デフォルトの名前空間を持つ XML ドキュメントで XPath を使用するのはどのような場合ですか?

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

When to Use XPath on XML Documents with a Default Namespace?

デフォルトの名前空間を持つ XML ドキュメントでの XPath の使用

デフォルトの名前空間でプレフィックスのない XML ドキュメントを操作する場合、XPath を使用できます。名前空間 URI を使用しないと、名前空間が存在しないかのようになります。ただし、DocumentBuilderFactory の namespaceAware プロパティを false に設定するだけでは、必ずしも十分とは限りません。

そのようなドキュメントで XPath を正常に使用するには、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>

XPath 式も修正されていることに注意してください。 、Dennis の提案に従って。

あるいは、次の簡略化されたコード スニペットも機能する可能性があります:

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

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

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