0

javaでxpathを使用して、xmlファイルから属性と値を持つすべての要素を抽出する例を誰かが提供できますか?

ありがとう

4

2 に答える 2

6

私はこれを数年前に私のチームのために書きました。役に立ちます。

xPath とは何ですか?

  1. XPath は、XML ドキュメント内の情報を検索するための言語です。
  2. XPath は、XML ドキュメントの一部を定義するための構文です。
  3. XPath は、パス式を使用して XML ドキュメント内をナビゲートします。
  4. XPath には、標準関数のライブラリが含まれています。
  5. XPath は XSLT の主要な要素です。
  6. XPath は W3C 勧告です。

XPath には、要素、属性、テキスト、名前空間、処理命令、コメント、およびドキュメント (ルート) ノードの 7 種類のノードがあります。XML ドキュメントは、ノードのツリーとして扱われます。ツリーのルートは、ドキュメント ノード (またはルート ノード) と呼ばれます。

次の Xml ドキュメントについて考えてみましょう。

<information>
    <person id="1">
        <name>Tito George</name>
        <age>25</age>
        <gender>Male</gender>
        <dob>
             <date>25</date>
             <month>october</month>
             <year>1983</year>
        </dob>
    </person>


     <person id="2">
        <name>Kumar</name>
        <age>32</age>
        <gender>Male</gender>
        <dob>
             <date>28</date>
             <month>january</month>
             <year>1975</year>
        </dob>
    </person>


    <person id="3">
        <name>Deepali</name>
        <age>25</age>
        <gender>Female</gender>
        <dob>
             <date>17</date>
             <month>january</month>
             <year>1988</year>
        </dob>
    </person>

</information>

ドキュメントから情報を取得する

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
//Getting the instance of DocumentBuilderFactory 
domFactory.setNamespaceAware(true);
//true if the parser produced will provide support for XML namespaces; 
DocumentBuilder builder = domFactory.newDocumentBuilder();
//Creating document builder
Document doc = builder.parse("C:\\JavaTestFiles\\persons.xml");
XPath xpath = XPathFactory.newInstance().newXPath();
//getting instance of xPath
expr = xpath.compile("//@id");
result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
 for (int i = 0; i < nodes.getLength(); i++) {
     System.out.println(nodes.item(i).getNodeValue());
}

上記の赤の行は、xPath 式のコンパイルに使用される行であり、//@id は実際の式です。式 //@id が返され、ドキュメント内の属性 id の値が返されます。すなわち。プログラムの出力は 1 2 および 3 になります。以下の表では、このドキュメントで使用できるさまざまな式を見つけることができます。

上記のコード スニペットの 2 つの重要なステートメントは次のとおりです。

  • expr = xpath.compile("//@id"); --> これは式をコンパイルします。コンパイルできない場合、このメソッドは XPathExpressionException をスローします。
  • expr.evaluate(doc, XPathConstants.NODESET); --> 指定されたコンテキストで XPath 式を評価し、指定された型として結果を返します。この 2 番目の引数は、メソッドが返すもの (returnType ) を定義します。returnType が XPathConstants で定義された型 (NUMBER、STRING、BOOLEAN、NODE、または NODESET) のいずれでもない場合、IllegalArgumentException がスローされます。

基本的に: XML ドキュメントは、ツリー構造 (階層) のノードのコレクションです。階層ディレクトリ構造と同様に、階層内の特定のノードを指すパスを指定すると便利です (したがって、仕様の名前: XPath)。

実際、ディレクトリ パスの表記の多くはそのまま引き継がれています。

  • スラッシュ (/) は、パス区切りとして使用されます。
  • ドキュメントのルートからの絶対パスは / で始まります。
  • 特定の場所からの相対パスは、それ以外から始まります。
  • 二重ピリオド (..) は、現在のノードの親を示します。
  • 単一のピリオド (.) は、現在のノードを示します。

情報

  • //@id --> id という名前のすべての属性を選択します
  • //@* --> ドキュメント内のすべての属性ノードを選択します
  • //@id='1' --> 属性 id = '1' を持つノードがドキュメントに存在するかどうかをテストします。存在する場合、ステートメントは true と評価されます。この場合、XPathConstants.BOOLEAN を evaluate メソッドの戻り値の型として使用する必要があります。
  • /information/person [age='24']name/text() または
    //person[age='24'] name/text() --> 'Kumar' を返します.. 最初にクエリを分割しましょう: /information /person[age='24']/name/text() パート 1: 要素 'age' = 24 を持つノード 'person' を検索します パート 2: そのノードの要素 'name' を取得します パート 3: テキスト() -- 要素 'name' のテキスト ノードを返す xPath 関数です。注: ここで、情報はルート ノードです。ルート ノードから開始する場合は、1 つのスラッシュで十分です。つまり、絶対パスです。子ノードから開始する場合は、二重スラッシュ '//' を使用する必要があります。つまり、相対パスです。
  • //person/dob[year>'1978'][year<1985]/../name/text() --> この式は、YOB が 1978 年から 1985 年の間にある人を検索しています。赤でマークされたテキストを確認してください。 . これは、要素 year が person の直接の子ではなく、兄弟である、つまり year の直接の親が node であるためです。したがって、要素「名前」を取得するには、1 レベル上に移動する必要があります。
  • //person/dob[年>'1978'][年<1985]/../@id --> 上記の条件を満たすノードのIDを返します。注: 属性値を取得するために text() メソッドを呼び出す必要はありません
  • //person[age='25']//dob[date=25]/../name/text() --> この式は、年齢 = 25、日付 = 25 の人物の名前を返します。
  • /information/person[1] /name/text() 一人称ノードの名前を検索します。
  • /information/person/ dob/child:: /text() --> dob のすべての子ノードを返します。child::information/child::person/child::dob/child:: /text()のように書くこともできます
于 2012-04-10T11:25:24.927 に答える
4

この XPath 式"//*"をこのように使用します

Document doc = ... // the document on which apply XPath
XPathExpression xp = XPathFactory.newInstance().newXPath().compile("//*");
NodeList elements = (NodeList) xp.evaluate(doc, XPathConstants.NODESET);

あらゆるレベルのすべての要素を返します。

于 2012-04-10T11:17:59.457 に答える