2016-06-01 8 views
1

XML文書から特定の値を抽出するために解析する必要があるXML文書があります。 スキーマは、この1のようになります。XML解析 - 特定の要素を検索

<sequence tag="771b,1030" vr="SQ" card="2" len="988" name="axial_length_values_sequence"> 
     <item card="6" len="486"> 
      <element tag="771b,0000" vr="UL" vm="1" len="4" name="PrivateGroupLength">474</element> 
      <element tag="771b,0010" vr="LO" vm="1" len="6" name="PrivateCreator">99CZM</element> 
      <element tag="771b,1008" vr="CS" vm="1" len="2" name="laterality">R</element> 
      <element tag="771b,1043" vr="FD" vm="1" len="8" name="mean_value_al">27.649999999999999</element> 
      <element tag="771b,1044" vr="FD" vm="1" len="8" name="mean_value_snr">272.5</element> 
     </item> 
     <item card="6" len="486"> 
      <element tag="771b,0000" vr="UL" vm="1" len="4" name="PrivateGroupLength">474</element> 
      <element tag="771b,0010" vr="LO" vm="1" len="6" name="PrivateCreator">99CZM</element> 
      <element tag="771b,1008" vr="CS" vm="1" len="2" name="laterality">L</element> 
      <element tag="771b,1043" vr="FD" vm="1" len="8" name="mean_value_al">27.0100000000000016</element> 
      <element tag="771b,1044" vr="FD" vm="1" len="8" name="mean_value_snr">151.90000000000001</element> 
     </item> 
    </sequence> 
    <sequence tag="771b,1032" vr="SQ" card="2" len="1268" name="keratometer_values_sequence"> 
     <item card="13" len="626"> 
      <element tag="771b,0000" vr="UL" vm="1" len="4" name="PrivateGroupLength">614</element> 
      <element tag="771b,0010" vr="LO" vm="1" len="6" name="PrivateCreator">99CZM</element> 
      <element tag="771b,1008" vr="CS" vm="1" len="2" name="laterality">R</element> 
      <element tag="771b,1016" vr="FD" vm="1" len="8" name="refractive_index">1.3374999999999999</element> 
      <element tag="771b,1017" vr="FD" vm="1" len="8" name="quali_tag">0</element> 
      <element tag="771b,1049" vr="FD" vm="1" len="8" name="mean_value_r1">8.5199999999999996</element> 
      <element tag="771b,104a" vr="FD" vm="1" len="8" name="mean_value_d1">39.609999999999999</element> 
      <element tag="771b,104b" vr="FD" vm="1" len="8" name="mean_value_a1">174</element> 
      <element tag="771b,104c" vr="FD" vm="1" len="8" name="mean_value_r2">8.4499999999999993</element> 
      <element tag="771b,104d" vr="FD" vm="1" len="8" name="mean_value_d2">39.939999999999998</element> 
      <element tag="771b,104e" vr="FD" vm="1" len="8" name="mean_value_a2">84</element> 
      <element tag="771b,104f" vr="FD" vm="1" len="8" name="mean_value_zyl">0.33000000000000003</element> 
     </item> 
     <item card="13" len="626"> 
      <element tag="771b,0000" vr="UL" vm="1" len="4" name="PrivateGroupLength">614</element> 
      <element tag="771b,0010" vr="LO" vm="1" len="6" name="PrivateCreator">99CZM</element> 
      <element tag="771b,1008" vr="CS" vm="1" len="2" name="laterality">L</element> 
      <element tag="771b,1016" vr="FD" vm="1" len="8" name="refractive_index">1.3374999999999999</element> 
      <element tag="771b,1017" vr="FD" vm="1" len="8" name="quali_tag">0.01</element> 
      <element tag="771b,1049" vr="FD" vm="1" len="8" name="mean_value_r1">8.4800000000000004</element> 
      <element tag="771b,104a" vr="FD" vm="1" len="8" name="mean_value_d1">39.799999999999997</element> 
      <element tag="771b,104b" vr="FD" vm="1" len="8" name="mean_value_a1">167</element> 
      <element tag="771b,104c" vr="FD" vm="1" len="8" name="mean_value_r2">8.3399999999999999</element> 
      <element tag="771b,104d" vr="FD" vm="1" len="8" name="mean_value_d2">40.469999999999999</element> 
      <element tag="771b,104e" vr="FD" vm="1" len="8" name="mean_value_a2">77</element> 
      <element tag="771b,104f" vr="FD" vm="1" len="8" name="mean_value_zyl">0.67000000000000002</element> 
     </item> 
    </sequence> 

あり、他の4「配列」の要素が解析します。

Iは、の値を抽出する必要がある各「配列」要素について

:I(左のために1回、2回、特定の値を保存する必要 R

及び値に従って(RまたはLであれば) "L")と一度右( "R") : タグ=の正しい値 "771Bは、1044年には" 次のようになります。 "272.5" と左のためには次のようになります。私は私の心を失うのです "151.90000000000001"

!!!!誰でも助けてくれますか? 特定のタグを検索すると単一の値を得ることができますが、最初に "R"を検索して "R"に関連付けられた値のみを検索し、 "L"を検索して関連する値を取得する方法は見つかりません!!! 「R」は必ずしも最初の要素ではない(「L」でもよい)ことを考慮してください。 ご協力いただけると幸いです。あらかじめ全員ありがとう!

+0

DOMを使用して特定の要素を検索しようとしましたが、特定のタグを1つ取得できますが、私の場合はタグが一意ではありません。 「ラテラリティ」は「アイテムカード」ごとに2回存在し、また、「アイテムカード」ごとに<要素タグ= "771b、1043"が2回存在する。 –

+0

私の答えは問題を解決しましたか?そうであれば、それを回答として受け入れることを検討してください。さもなければ、後続のコメントを投稿してください。 –

答えて

1

使用JSOUP:https://jsoup.org/

私は、ファイルのtest.xmlにあなたのxmlをコピーしてJSOUPとそれを解析さ:

final Document doc = Jsoup.parse(new File(".\\test.xml"), "UTF-8"); 

String tag; 
BigDecimal left=new BigDecimal(0); 
BigDecimal right=new BigDecimal(0); 

for (Element sequence : doc.select("sequence")) { 
    tag = sequence.attr("tag"); 

    for (Element item : sequence.select("element[name='laterality']")) { 

     String value=""; 

     if(tag.equals("771b,1030")) value = item.siblingElements().select("element[name='mean_value_snr']").text(); 
     //specify correct name for other sequences here 

     if(!value.isEmpty()){ 
      if(item.text().equals("L")) left = new BigDecimal(value); 
      if(item.text().equals("R")) right = new BigDecimal(value); 
     }else{ 
      left=new BigDecimal(0); 
      right=new BigDecimal(0); 
     } 
    } 

    System.out.println(tag + ": " + "L mean_value=" + left + " | R mean_value=" + right); 
} 

プリントアウト:

771b,1030: L mean_value=151.90000000000001 | R mean_value=272.5 
771b,1032: L mean_value=0 | R mean_value=0 

UPDATE:を交換します精度を失うことを避けるためにBigDecimalで倍精度化します

+0

あなたは最高です!このソリューションをありがとう!それは完全に動作します!私は希望を失い始めました(そして私の心!)、あなたはそれをとても簡単にしました!もう一度感謝します! –

+0

うまくやってくれてうれしいです。乾杯:) –

関連する問題