2017-02-06 13 views
0

現在Javaを使用して値を抽出する興味深い多層ネストされたXMLがあります。Javaを使用してネストされたXMLの隣接ノードから値を抽出する最適な方法

このXMLのすべてのノードには汎用タグがあり、各タグには一般的なキーワードがあります。

抽出したい値は多くのレイヤーが深く、それを識別する方法は一般的なキーワード "NumericalValue"(同じキーワードを持つ多くのノードがあります)であるキーワードではありません。

一般的なキーワード "WordRepresentation"(同じキーワードで多くのノードがあります)と値 "Customer ID"を持つノード(その上に> = 1ノード以上)があります。確かに、「顧客ID」という値が存在する場合、下に1つ以上のノードがあると、キーワード「NumericalValue」とその値を見つけることができます。

私が望む値を抽出するロジックは、まず "Customer ID"という値が含まれているレベルが見つかるまでネストされたXMLのラップを解除し、何とかそのレベルをメモして同じレベルでナビゲートしますキーワード "NumericValue"を見つけて値を記録するまで次のノードを検索します。

ネストされたXML内で特定の値を検索し、同じレベルで2回目の検索を行うには良い方法がありますか?以下は

はXMLの例です。

<xml> 
<layer 1> 
    <layer 2> 
    </layer 2> 
    <layer 2> 
     <layer 3> 
       <layer 4> 
        <layer 5> 
         <layer 6> 
          <layer 7 keyword=WordRepresentaion> 
            <Value>Customer ID</Value> 
          </layer 7> 
          ... 
          <layer 7 keyword=NumbericalValue> 
            <Value>453</Value> 
          </layer7> 
          ... 

         </layer 6> 

        </layer 5> 
       </layer 4> 
     </layer 3> 


    </layer 2> 
    ... 

    ... 
    <layer 2> 
    </layer 2> 
    <layer 2> 
    </layer 2> 
</layer 1> 

は、私は私はあなたが何をしようとしている正確に理解のかはわからないが、あなたはjsoupにを使用することができ、あなたの助け

答えて

1

いただき、ありがとうございますXMLを解析します。 keyword= NumbericalValueが選択され、ループ内で、我々は、彼らが持っているかどうかを確認するために、それ以上の要素を見ているすべてのこの例では

Elements els = doc.select("[keyword=NumbericalValue]"); 

    for (Element e : els) { 
     int index = e.siblingIndex(); 
     Elements elementsAbove = e.parent().getElementsByIndexLessThan(index); 
     for (Element above : elementsAbove) { 
      // Check if this node has an inner node with the value "Customer ID" 
      if (above.select("Value:contains(Customer ID)").size() > 0) { 
       System.out.println("FOUND A MATCH:\n" + e.outerHtml()); 
       break; 
      } 
     } 
    } 

:ここ

String xml = "<xml>\n<layer 1>\n <layer 2>\n </layer 2>\n <layer 2>\n   <layer 3>\n    <layer 4>\n     <layer 5>\n      <layer 6>\n        <layer 7 keyword=WordRepresentaion>\n         <Value>Customer ID</Value>\n        </layer 7>\n        <layer 7 keyword=NumbericalValue>\n         <Value>453</Value>\n        </layer7>\n      </layer 6>\n\n     </layer 5>\n    </layer 4>\n   </layer 3>\n </layer 2>\n <layer 2>\n </layer 2>\n <layer 2>\n </layer 2>\n</layer 1>\n</xml>"; 
    Document doc = Jsoup.parse(xml); 

    Elements elms = doc.select("Value:contains(Customer ID)"); // get all the elements that are about the searched one 
    if (elms.size() > 0) { 
     Element wrapper = elms.first().parent(); // get the first one's parent 
     Element layer = wrapper.parent(); 
     Elements layerChildren = layer.getElementsByIndexGreaterThan(wrapper.elementSiblingIndex()); // get all elements in the layer that are below the reference element 
     for (Element e : layerChildren) { 
      if (e.attr("keyword").equals("NumbericalValue")) { // check to see if this is the searched element. 
       System.out.println("Got the element:\n" + e.outerHtml()); 
      } 
     } 
    } 

別のアプローチされています。次に例を示します。その値はCustomer ID

+0

に設定されています。ちょっと明確にするために、キーワード "NumericalValue"を持つノードの値を抽出しようとしています。しかし、そのキーワードを持つノードが多いので、同じレベルの1つ以上のノードを見て、別のノードに「顧客ID」という値があるかどうかを調べる必要があります。 – 000000000000000000000

+1

@ 000000000000000000000私の答えのサンプルコードはそうすると思います。別のアプローチは、 'keyword = NumericalValue'ノードを直接検索し、その上にあるノードを見て、それらが' Customer ID'値を持っているかどうかを調べることです。まもなくこれを行う例を掲載します。 – Titus

関連する問題