2011-07-07 17 views
8

Tiene problemas para analizar xml con dom y DocumentBuilder. Soy capaz de hacerlo funcionar, pero supongo que me sale un poco confundido con todos los nodos secundarios, etc.análisis Xml con NodeList y DocumentBuilder

Aquí está el XML estoy trabajando con:

<?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> 

lo que intento hacer es agarrar cada elemento LabTest y, dentro de cada uno de esos elementos, agarrar los elementos value (y tomar el valor de type) y, dentro del elemento value, agarrar todos los elementos condition.

Al final, quiero algo así como un Map<String, HashMap<String, ArrayList<String>>, donde el String es el nombre LabTest y la HashMap utiliza el type (por ejemplo decreased, increased, etc) para la llave y luego se llena el ArrayList con las condiciones para que value tipo.

¿Confundir suficiente?

Básicamente, solo necesito un ejemplo, creo, de cómo recorrer y tomar cada LabTest con sus elementos de "valor", y cada elemento de "condición" debajo de esos elementos de "valor".

Respuesta

31

que debería funcionar como usted la describe:

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

Muchas gracias. ¡¡Esto es fantástico!! – LuxuryMode

+0

Muchas gracias :) –

0

También tenga en cuenta que hay un hermoso concepto de representación no literal de los valores de los nodos XML en lista de nodos, al analizar.