ホームページ > Java > &#&チュートリアル > Java で XML ドキュメントから XPath 式をプログラムで生成するにはどうすればよいですか?

Java で XML ドキュメントから XPath 式をプログラムで生成するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-30 19:24:15
オリジナル
170 人が閲覧しました

How to Programmatically Generate XPath Expressions from an XML Document in Java?

Java で XML から XPath を生成/取得する方法

はじめに

この記事では、Java で XML ドキュメントから XPath 式を抽出する方法について説明します。 。 XML ノードを走査し、属性の存在を確認し、それに応じて XPath 文字列を生成するプロセスについて説明します。

目標

私たちの目的は、次の XML ドキュメントから XPath 式を生成することです:

<root>
    <elemA>one</elemA>
    <elemA attribute1='first' attribute2='second'>two</elemA>
    <elemB>three</elemB>
    <elemA>four</elemA>
    <elemC>
        <elemB>five</elemB>
    </elemC>
</root>
ログイン後にコピー

を実行し、次の XPath を取得します。式:

//root[1]/elemA[1]='one'
//root[1]/elemA[2]='two'
//root[1]/elemA[2][@attribute1='first']
//root[1]/elemA[2][@attribute2='second']
//root[1]/elemB[1]='three'
//root[1]/elemA[3]='four'
//root[1]/elemC[1]/elemB[1]='five'
ログイン後にコピー

実装

1. XML ドキュメントを走査します。

JDOM や SAX などの Java XML 解析ライブラリを使用して、XML ノード間を移動します。

2.属性の存在の確認:

各ノードについて、属性があるかどうかを確認します。そうでない場合は、XPath の生成に進みます。

3.属性を持つノードの XPath の生成:

属性を持つノードの場合、ノードと各属性の両方の XPath 式を作成します。

4. XPath 式の結合:

ノードと属性に対して生成された XPath 式を連結して、最終的な XPath 文字列を作成します。例:

String xpath = "//root[1]/elemA[1]='" + nodeValue + "'";
ログイン後にコピー

5.特殊なケースの処理:

XPath 式内のスペースや属性値を一重引用符で囲む必要性などの特殊なケースを考慮します。

次のコード スニペットでの実装を示しますJava:

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class GenerateXPath {

    public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException {
        // Read the XML file
        File xmlFile = new File("path_to_xml.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(xmlFile);

        // Traverse the XML nodes
        NodeList nodes = doc.getElementsByTagName("*");
        for (int i = 0; i < nodes.getLength(); i++) {
            Node node = nodes.item(i);

            // Check for attribute existence
            if (node.getAttributes().getLength() == 0) {
                // Generate XPath for nodes without attributes
                String xpath = generateXPath(node);
                System.out.println(xpath);
            } else {
                // Generate XPath for nodes with attributes
                xpath = generateXPathWithAttributes(node);
                System.out.println(xpath);
            }
        }
    }

    private static String generateXPath(Node node) {
        String xpath = "";

        // Append tag name
        xpath += "/" + node.getNodeName();

        // Append position index
        NodeList siblings = node.getParentNode().getChildNodes();
        int position = 1;
        for (int i = 0; i < siblings.getLength(); i++) {
            if (siblings.item(i).getNodeName().equals(node.getNodeName())) {
                position++;
            }
        }
        xpath += "[" + position + "]";

        return xpath;
    }

    private static String generateXPathWithAttributes(Node node) {
        List<String> xpathParts = new ArrayList<>();

        // Append tag name
        xpathParts.add("/" + node.getNodeName());

        // Append position index
        NodeList siblings = node.getParentNode().getChildNodes();
        int position = 1;
        for (int i = 0; i < siblings.getLength(); i++) {
            if (siblings.item(i).getNodeName().equals(node.getNodeName())) {
                position++;
            }
        }
        xpathParts.add("[" + position + "]");

        // Append attributes
        NamedNodeMap attributes = node.getAttributes();
        for (int i = 0; i < attributes.getLength(); i++) {
            Node attribute = attributes.item(i);
            xpathParts.add("[@" + attribute.getNodeName() + "='" + attribute.getNodeValue() + "']");
        }

        return String.join("", xpathParts);
    }
}
ログイン後にコピー

結論

上記の手順に従うと、Java で XML ドキュメントの XPath 式をプログラム的に生成することができ、XML コンテンツからデータを抽出するための自動化されたアプローチを提供できます。

以上がJava で XML ドキュメントから XPath 式をプログラムで生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート