Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

parsing Xml with NodeList and DocumentBuilder

Tags:

java

dom

xml

Having a bit of trouble parsing xml with dom and DocumentBuilder. I'm able to get it working, but I guess I get a bit confused with all the child nodes, etc.

Here's the XML I'm working with:

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

what I'm trying to do is grab hold of each LabTest element and, within each of those elements, grab hold of the value elements (and grab the value of type) and, within the value element, grab hold of all of the condition elements.

In the end, I want something like a Map<String, HashMap<String, ArrayList<String>>, where the String is the LabTest name and the HashMap uses the type (e.g. decreased, increased, etc) for the key and then fills up the ArrayList with the conditions for that value type.

Confusing enough?

Basically, I just need an example, I think, of how to loop through and grab each LabTest with its "value" elements, and each of the "condition" elements under those "value" elements.

like image 536
LuxuryMode Avatar asked Jul 07 '11 01:07

LuxuryMode


People also ask

What is NodeList in XML?

The NodeList object represents an ordered list of nodes.

Which is the valid code to extract the root of an XML document in a DOM parser?

Instantiate XML file: DOM parser loads the XML file into memory and consider every tag as an element. Get root node: Document class provides the getDocumentElement() method to get the root node and the element of the XML file.

What is DOM parser in Java?

Advertisements. The Document Object Model (DOM) is an official recommendation of the World Wide Web Consortium (W3C). It defines an interface that enables programs to access and update the style, structure, and contents of XML documents. XML parsers that support DOM implement this interface.


1 Answers

That should work as you described:

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();
        }
    }
}
like image 99
Grzegorz Szpetkowski Avatar answered Sep 28 '22 10:09

Grzegorz Szpetkowski