2011-07-07 76 views
8

用dom和DocumentBuilder解析xml有些麻煩。我能得到它的工作,但我想我得到一點與所有的子節點困惑等用NodeList和DocumentBuilder解析XML

這裏是我的工作的XML:

<?xml version="1.0" encoding="utf-8"?> 
<LabTests> 
    <LabTest type="specialty" name="Anti-FXa activity" id="antiFXa" order="16"> 
     <values unit="U/mL" default="N/A"> 
      <value type="increased" val="0"> 
       <conditions> 
        <condition>Heparin effect</condition> 
       </conditions> 
      </value> 
      <value type="normal" val=""> 
       <conditions></conditions> 
      </value> 
      <value type="decreased" val=""> 
       <conditions></conditions> 
      </value> 
     </values> 
    </LabTest> 
    <LabTest type="general" name="aPTT" id="aPTT" order=""> 
     <values unit="secs" default="N/A"> 
      <value type="increased" val=""> 
       <conditions> 
        <condition>Acquired hemophilia</condition> 
        <condition>Acquired vWD</condition> 
        <condition>DIC</condition> 
        <condition>Dysfibrinogenemia</condition> 
        <condition>FI deficiency</condition> 
        <condition>FII deficiency</condition> 
        <condition>FII/IIa inhibitors</condition> 
        <condition>FIX deficiency</condition> 
        <condition>FIX inhibitors</condition> 
        <condition>FV deficiency</condition> 
        <condition>FV inhibitors</condition> 
        <condition>FVIII deficiency</condition> 
        <condition>FX deficiency</condition> 
        <condition>FX inhibitors</condition> 
        <condition>FXI deficiency</condition> 
        <condition>FXI inhibitors</condition> 
        <condition>FXII deficiency</condition> 
        <condition>FXII inhibitors</condition> 
        <condition>Heparin effect</condition> 
        <condition>Liver disease effect</condition> 
        <condition>Lupus anticoagulant</condition> 
        <condition>Monoclonal gammopathy</condition> 
        <condition>Vitamin K deficiency</condition> 
        <condition>vWD type 1</condition> 
        <condition>vWD type 2</condition> 
        <condition>vWD type 3</condition> 
        <condition>Warfarin effect</condition> 
       </conditions> 
      </value> 
      <value type="normal" val=""> 
       <conditions> 
        <condition>DIC</condition> 
        <condition>Dysfibrinogenemia</condition> 
        <condition>FVII deficiency</condition> 
        <condition>FXIII deficiency</condition> 
        <condition>FVII inhibitors</condition> 
        <condition>Liver disease effect</condition> 
        <condition>Lupus anticoagulant</condition> 
        <condition>Monoclonal gammopathy</condition> 
        <condition>Vitamin K deficiency</condition> 
        <condition>vWD type 1</condition> 
        <condition>vWD type 2</condition> 
        <condition>vWD type 3</condition> 
        <condition>Warfarin effect</condition> 
       </conditions> 
      </value> 
      <value type="decreased" val=""> 
       <conditions> 
        <condition>DIC</condition> 
       </conditions> 
      </value> 
     </values> 
    </LabTest> 
</LabTests> 

我嘗試要做的是抓住每個LabTest元素,並在每個元素中抓住元素的value(並獲取值type),並在value元素內抓住所有condition元素。

最後,我想是這樣一個Map<String, HashMap<String, ArrayList<String>>,其中StringLabTest名稱和HashMap使用type(如decreasedincreased等)爲重點,然後填補了該條件的ArrayList中value類型。

混淆不夠?我基本上只需要一個例子,我想知道如何通過它的「值」元素以及這些「值」元素下的每個「條件」元素來循環和抓取每個LabTest。

回答

31

,當你描述應該工作:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 

Document doc = builder.parse("input.xml"); 

NodeList labTestList = doc.getElementsByTagName("LabTest"); 
for (int i = 0; i < labTestList.getLength(); ++i) 
{ 
    Element labTest = (Element) labTestList.item(i); 
    String labTestType = labTest.getAttribute("type"); 

    NodeList valueList = labTest.getElementsByTagName("value"); 
    for (int j = 0; j < valueList.getLength(); ++j) 
    { 
     Element value = (Element) valueList.item(j); 
     String valueType = value.getAttribute("type"); 

     NodeList conditionList = value.getElementsByTagName("condition"); 
     for (int k = 0; k < conditionList.getLength(); ++k) 
     { 
      Element condition = (Element) conditionList.item(k); 
      String conditionText = condition.getFirstChild().getNodeValue(); 
     } 
    } 
} 
+0

非常感謝。這是太棒了!! – LuxuryMode

+0

非常感謝你:) –

0

還要注意,在節點列表進行反向轉義XML節點值的美麗概念,在解析。