2

Having been used to Actionscript 3 XML parsing approach I find Java way of parsing little overwhelming. Using E4X I could have used dot notation and tag name along with conditions I can reach the node I required. I could see no such option in Java, I checked many examples online with help in parsing most of them do not go beyond the basics.

Am I on right path with DOM parser or should I try some other parser for XML?

I have quite a big XML file (which I cut down to fit) which has to be parsed.

How can I get value in XML node CANDELA -> ECUDOC -> ECU -> VAR -> DIAGCLASS -> DIAGINST? Is it possible get set of nodes as XMLList in Actionscript?

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = null;
        try {
            builder = builderFactory.newDocumentBuilder();
            Document document = builder.parse(new FileInputStream("pathToXML"));

            NodeList nodes = document.getElementsByTagName("*");

            for(int i = 0; i < nodes.getLength(); i++){
                System.out.println(nodes.item(i).getNodeName());
            }
            System.out.println("Number of childs under ECU "+ nodes.getLength());
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }

<?xml version='1.0' encoding='iso-8859-1' standalone='no'?>
<!DOCTYPE CANDELA SYSTEM 'candela.dtd'>
<CANDELA dtdvers='2.0.5'>
    <ECUDOC doctype='inst' manufacturer='no' mid='323232' saveno='59' languages='(en-US,de-DE)' uptodateLanguages='(en-US)' jobfileext=''>
        <ATTRCATS>
            <ATTRCAT id='_0x01ded158'>
                <NAME>
                    <TUV xml:lang='en-US'>Time</TUV>
                    <TUV xml:lang='de-DE'>Zeit</TUV>
                </NAME>
                <QUAL>Zeit</QUAL>
            </ATTRCAT>
        </ATTRCATS>
        <AUTHORS>
            <AUTHOR id='_0x01dfae70' obs='0'>
                <LASTNAME>Rätz</LASTNAME>
                <FIRSTNAME>Christoph</FIRSTNAME>
            </AUTHOR>
        </AUTHORS>
        <ECU id='_0x01da31c8'>
            <NAME>
                <TUV xml:lang='en-US'>Any ECU example</TUV>
                <TUV xml:lang='de-DE'>Ein Beispiel-Steuergerät</TUV>
            </NAME>
            <DESC>
                <TUV xml:lang='en-US' struct='1'>
                   <PARA>
                        <FC>This is an manufacturer independent example to demonstrate the usage of CANdelaStudio.</FC>
                    </PARA>
                    <PARA>
                        <FC></FC>
                    </PARA>
                    <PARA>
                        <FC>This example is based on the Vector document template (manufacturer independent).</FC>
                    </PARA>
                    <PARA>
                        <FC>For a concrete project, we recommend to use a manufacturer specific document template, which must be generated by Vector at the time.</FC>
                    </PARA>
                </TUV>
                <TUV xml:lang='de-DE' struct='1'>
                    <PARA>
                        <FC>Dies ist ein herstellerunabhängiges Beispiel. Es zeigt die Verwendung von CANdelaStudio.</FC>
                    </PARA>
                    <PARA>
                        <FC></FC>
                    </PARA>
                    <PARA>
                        <FC>Das Beispiel basiert auf der Hersteller-unabhängigen Vector-Dokumentvorlage.</FC>
                    </PARA>
                    <PARA>
                        <FC>Für ein konkretes Projekt sollten Sie eine Hersteller-spezifische Dokumentvorlage verwenden. Diese wird (zur Zeit noch) von Vector erstellt.</FC>
                    </PARA>
                </TUV>
            </DESC>
            <QUAL>Any_ECU_example</QUAL>
            <UNS attrref='_0x01233bc8' v='513'/>
            <UNS attrref='_0x01235af8' v='1025'/>
            <ENUM attrref='_0x01ddc9c0' v='0'/>
            <VAR id='_0x01dae6f0' base='1'>
                <NAME>
                    <TUV xml:lang='en-US'>Common Diagnostics</TUV>
                    <TUV xml:lang='de-DE'>Grundumfang</TUV>
                </NAME>
                <DESC>
                    <TUV xml:lang='en-US' struct='1'>
                        <PARA>
                            <FC fs='0'>Base model which all variants of the ECU must support</FC>
                        </PARA>
                    </TUV>
                    <TUV xml:lang='de-DE' struct='1'>
                        <PARA>
                            <FC fs='0'>Grundumfang, den alle Varianten des Steuergerätes unterstützen</FC>
                        </PARA>
                    </TUV>
                </DESC>
                <QUAL>COMMON_DIAGNOSTICS</QUAL>
                <DIAGCLASS id='_0x01db0320' tmplref='_0x01dce558'>
                    <NAME>
                        <TUV xml:lang='en-US'>Start Session</TUV>
                        <TUV xml:lang='de-DE'>Sitzungen starten</TUV>
                    </NAME>
                    <QUAL>START_SESSION</QUAL>
                    <DIAGINST id='_0x01dd0598' tmplref='_0x01dce558' req='0'>
                        <NAME>
                            <TUV xml:lang='en-US'>Default Session (OBDII)</TUV>
                            <TUV xml:lang='de-DE'>Default Session (OBDII)</TUV>
                        </NAME>
                        <QUAL>DEFAULT_SESSION</QUAL>
                        <SERVICE id='_0x01dd0720' tmplref='_0x01dce630' func='0' phys='1' mresp='0' respOnPhys='1' respOnFunc='0' req='0'>
                            <NAME>
                                <TUV xml:lang='en-US'>Start</TUV>
                                <TUV xml:lang='de-DE'>Starten</TUV>
                            </NAME>
                            <QUAL>Start</QUAL>
                        </SERVICE>
                        <STATICVALUE shstaticref='_0x01dbebb0' v='129'/>
                        <SIMPLECOMPCONT shproxyref='_0x01dbec18'>
                            <SPECDATAOBJ id='_0x01dfd658' spec='rc'>
                                <NAME>
                                    <TUV xml:lang='en-US'>Negative response codes</TUV>
                                    <TUV xml:lang='de-DE'>Negative response codes</TUV>
                                </NAME>
                                <QUAL>NRC</QUAL>
                                <TEXTTBL id='_0x01dda9c8' bm='4294967295'>
                                    <NAME>
                                        <TUV xml:lang='en-US'>LocalTable</TUV>
                                        <TUV xml:lang='de-DE'>LocalTable</TUV>
                                    </NAME>
                                    <QUAL>LocalTable</QUAL>
                                    <CVALUETYPE bl='8' bo='21' enc='uns' sig='0' df='hex' qty='atom' sz='no' minsz='0' maxsz='255'/>
                                    <PVALUETYPE bl='8' bo='21' enc='asc' sig='0' df='text' qty='field' sz='no' minsz='0' maxsz='255'/>
                                    <TEXTMAP s='16' e='16'>
                                        <TEXT>
                                            <TUV xml:lang='en-US'>General reject</TUV>
                                            <TUV xml:lang='de-DE'>Allgemeine Verweigerung</TUV>
                                        </TEXT>
                                    </TEXTMAP>
                                    <TEXTMAP s='18' e='18'>
                                        <TEXT>
                                            <TUV xml:lang='en-US'>Subfunction not supported - invalid format</TUV>
                                            <TUV xml:lang='de-DE'>Unterfunktion nicht unterstützt oder ungültiges Format</TUV>
                                        </TEXT>
                                    </TEXTMAP>
                                    <TEXTMAP s='120' e='120'>
                                        <TEXT>
                                            <TUV xml:lang='en-US'>Request correctly received - response pending</TUV>
                                            <TUV xml:lang='de-DE'>Anforderung erhalten - Antwort steht aus</TUV>
                                        </TEXT>
                                    </TEXTMAP>
                                    <TEXTMAP s='128' e='128'>
                                        <TEXT>
                                            <TUV xml:lang='en-US'>Service not supported in active diagnostic mode</TUV>
                                            <TUV xml:lang='de-DE'>Service nicht unterstützt in aktiver Session</TUV>
                                        </TEXT>
                                    </TEXTMAP>
                                </TEXTTBL>
                            </SPECDATAOBJ>
                        </SIMPLECOMPCONT>
                    </DIAGINST>
                    <DIAGINST id='_0x01dd1520' tmplref='_0x01dce558' req='0'>
                        <NAME>
                            <TUV xml:lang='en-US'>Programming Session</TUV>
                            <TUV xml:lang='de-DE'>Programming Session</TUV>
                        </NAME>
                        <QUAL>ProgrammingSession</QUAL>
                        <SERVICE id='_0x01dd1660' tmplref='_0x01dce630' func='0' phys='1' mresp='0' respOnPhys='1' respOnFunc='0' req='0'>
                            <NAME>
                                <TUV xml:lang='en-US'>Start</TUV>
                                <TUV xml:lang='de-DE'>Starten</TUV>
                            </NAME>
                            <QUAL>Start</QUAL>
                        </SERVICE>
                        <STATICVALUE shstaticref='_0x01dbebb0' v='133'/>
                        <SIMPLECOMPCONT shproxyref='_0x01dbec18'>
                            <SPECDATAOBJ id='_0x01daf378' spec='rc'>
                                <NAME>
                                    <TUV xml:lang='en-US'>Negative response codes</TUV>
                                    <TUV xml:lang='de-DE'>Negative response codes</TUV>
                                </NAME>
                                <QUAL>NRC</QUAL>
                                <TEXTTBL id='_0x01dd9da8' bm='4294967295'>
                                    <NAME>
                                        <TUV xml:lang='en-US'>LocalTable</TUV>
                                        <TUV xml:lang='de-DE'>LocalTable</TUV>
                                    </NAME>
                                    <QUAL>LocalTable</QUAL>
                                    <CVALUETYPE bl='8' bo='21' enc='uns' sig='0' df='hex' qty='atom' sz='no' minsz='0' maxsz='255'/>
                                    <PVALUETYPE bl='8' bo='21' enc='asc' sig='0' df='text' qty='field' sz='no' minsz='0' maxsz='255'/>
                                    <TEXTMAP s='16' e='16'>
                                        <TEXT>
                                            <TUV xml:lang='en-US'>General reject</TUV>
                                            <TUV xml:lang='de-DE'>Allgemeine Verweigerung</TUV>
                                        </TEXT>
                                    </TEXTMAP>
                                    <TEXTMAP s='18' e='18'>
                                        <TEXT>
                                            <TUV xml:lang='en-US'>Subfunction not supported - invalid format</TUV>
                                            <TUV xml:lang='de-DE'>Unterfunktion nicht unterstützt oder ungültiges Format</TUV>
                                        </TEXT>
                                    </TEXTMAP>
                                    <TEXTMAP s='120' e='120'>
                                        <TEXT>
                                            <TUV xml:lang='en-US'>Request correctly received - response pending</TUV>
                                            <TUV xml:lang='de-DE'>Anforderung erhalten - Antwort steht aus</TUV>
                                        </TEXT>
                                    </TEXTMAP>
                                    <TEXTMAP s='128' e='128'>
                                        <TEXT>
                                            <TUV xml:lang='en-US'>Service not supported in active diagnostic mode</TUV>
                                            <TUV xml:lang='de-DE'>Service nicht unterstützt in aktiver Session</TUV>
                                        </TEXT>
                                    </TEXTMAP>
                                </TEXTTBL>
                            </SPECDATAOBJ>
                        </SIMPLECOMPCONT>
                    </DIAGINST>
                </DIAGCLASS>
                <DIAGINST id='_0x01dd2458' tmplref='_0x01dbec98' req='0'>
                    <NAME>
                        <TUV xml:lang='en-US'>Stop Session</TUV>
                        <TUV xml:lang='de-DE'>Sitzungen beenden</TUV>
                    </NAME>
                    <QUAL>STOP_SESSION</QUAL>
                    <SERVICE id='_0x01dd2598' tmplref='_0x01dbed70' func='0' phys='1' mresp='0' respOnPhys='1' respOnFunc='0' req='0'>
                        <NAME>
                            <TUV xml:lang='en-US'>Stop</TUV>
                            <TUV xml:lang='de-DE'>Beenden</TUV>
                        </NAME>
                        <QUAL>Stop</QUAL>
                    </SERVICE>
                    <SIMPLECOMPCONT shproxyref='_0x01dbee18'>
                        <SPECDATAOBJ id='_0x01dda908' spec='rc'>
                            <NAME>
                                <TUV xml:lang='en-US'>Negative response codes</TUV>
                                <TUV xml:lang='de-DE'>Negative response codes</TUV>
                            </NAME>
                            <QUAL>NRC</QUAL>
                            <TEXTTBL id='_0x01237e70' bm='4294967295'>
                                <NAME>
                                    <TUV xml:lang='en-US'>LocalTable</TUV>
                                    <TUV xml:lang='de-DE'>LocalTable</TUV>
                                </NAME>
                                <QUAL>LocalTable</QUAL>
                                <CVALUETYPE bl='8' bo='21' enc='uns' sig='0' df='hex' qty='atom' sz='no' minsz='0' maxsz='255'/>
                                <PVALUETYPE bl='8' bo='21' enc='asc' sig='0' df='text' qty='field' sz='no' minsz='0' maxsz='255'/>
                                <TEXTMAP s='16' e='16'>
                                    <TEXT>
                                        <TUV xml:lang='en-US'>General reject</TUV>
                                        <TUV xml:lang='de-DE'>Allgemeine Verweigerung</TUV>
                                    </TEXT>
                                </TEXTMAP>
                                <TEXTMAP s='18' e='18'>
                                    <TEXT>
                                        <TUV xml:lang='en-US'>Subfunction not supported - invalid format</TUV>
                                        <TUV xml:lang='de-DE'>Unterfunktion nicht unterstützt oder ungültiges Format</TUV>
                                    </TEXT>
                                </TEXTMAP>
                                <TEXTMAP s='120' e='120'>
                                    <TEXT>
                                        <TUV xml:lang='en-US'>Request correctly received - response pending</TUV>
                                        <TUV xml:lang='de-DE'>Anforderung erhalten - Antwort steht aus</TUV>
                                    </TEXT>
                                </TEXTMAP>
                                <TEXTMAP s='128' e='128'>
                                    <TEXT>
                                        <TUV xml:lang='en-US'>Service not supported in active diagnostic mode</TUV>
                                        <TUV xml:lang='de-DE'>Service nicht unterstützt in aktiver Session</TUV>
                                    </TEXT>
                                </TEXTMAP>
                            </TEXTTBL>
                        </SPECDATAOBJ>
                    </SIMPLECOMPCONT>
                </DIAGINST>
            </VAR>
        </ECU>
    </ECUDOC>
</CANDELA>
James Shaji
  • 316
  • 5
  • 17
  • Where is the code? offtopic: Try xpath: http://stackoverflow.com/questions/2811001/how-to-read-xml-using-xpath-in-java – Jayan Nov 11 '13 at 04:54
  • @Jayan code what I have is basic, I can loop through all nodes and get all the nodes. I am unable to get values under specific nodes, I have no idea how to drill down specific node. – James Shaji Nov 11 '13 at 05:04
  • why not post the code? – Jayan Nov 11 '13 at 06:18

2 Answers2

2

If you were using DOM parsing on the same size data in ActionScript, then you can use DOM parsing in Java; however, I do not recommend using the standard w3c API which is old and clumsy. A modern DOM library such as jdom2 will offer a lot more flexibility, such as retrieving child nodes by name. Here is an example using jdom2. All the getChild() calls could of course be replaced by an XPath.

Document doc = new SAXBuilder().build(new File("CANDELA.xml"));
List<Element> list = doc.getRootElement()
        .getChild("ECUDOC")
        .getChild("ECU")
        .getChild("VAR")
        .getChild("DIAGCLASS")
        .getChildren("DIAGINST");
System.out.println(list.size() + " DIAGINST nodes");

for (Element node : list) {
    System.out.println(node.getAttribute("id").getValue()
            + " = " + node.getChildText("QUAL"));
}
jaco0646
  • 15,303
  • 7
  • 59
  • 83
1

The DOM parser stores the entire document in-memory, which is often not suitable for large files. It makes up for that by being pretty easy to use, so if you can fit your whole file in memory, I'd reccomend it.

Otherwise, another great option is SAX. http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/ is a good tutorial on how to use it, and it doesn't load the entire document in memory, but uses callbacks to let you respond to different tags.

Hopefully this is a useful starting point!

mattdee123
  • 213
  • 1
  • 5
  • 11