# DOM Parser Implementieren



## Lena09 (18. Mai 2015)

Hallo,

ich hoffe sehr, dass sie mir helfen können.
Ich muss einen DOM Parser implementieren, der folgendes xml-Dokument einliest: 

[xml]
<?xmlversion="1.0"encoding="UTF-8"?>


<Studentendaten>
<Student>
<Name>
<Anrede>Herr</Anrede>
<Vorname>Max</Vorname>
<Nachname>Mustermann</Nachname>
</Name>
<Matrikelnummer>12345678</Matrikelnummer>
<Anschrift>
<Strasse>Waldstrasse</Strasse>
<Hausnummer>125</Hausnummer>
<Ort>Berlin</Ort>
<Plz>12345</Plz>
</Anschrift>
<LieferAnschrift>
<Strasse>Waldstrasse</Strasse>
<Hausnummer>100</Hausnummer>
<Ort>Berlin</Ort>
<Plz>12345</Plz>
</LieferAnschrift>
<Kontodaten>
<Kontonummer>123 456 789 00</Kontonummer>
<Blz>200 150 00</Blz>
<Kontoinhaber>Mustermann</Kontoinhaber>
</Kontodaten>
<Leistungsnachweis>
<Kurs>20400</Kurs>
<Note>1.0</Note>
<GesamtPunkte>100</GesamtPunkte>
<Datum>10.03.2015</Datum>
<AnzVersuche>1</AnzVersuche>
</Leistungsnachweis>
<SchriftlicheArbeitArt="Bachelorarbeit">
<Thema>Informationssysteme</Thema>
<Note>1,0</Note>
<Betreuer>Prof. Muster</Betreuer>
<Abgabedatum>20.04.2015</Abgabedatum>
</SchriftlicheArbeit>
<Anmerkung>Sonstiges...</Anmerkung>
</Student>
</Studentendaten>
[/xml]


Die Eingelesene Baumstruktur soll am Bildschirm ausgegeben werden, danach soll ein neuer Leistungsnachweis eingefügt werden, sowie die Kontodaten des Studenten geändert werden. Danach soll die geänderte Baumstruktur in einer xml-Datei gespeichert werden.

Folgenden Java-Code habe ich geschrieben:




```
import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;


import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


public class MyDOMParser {


    private static void printNodes(NodeList nodelist) {


        Node tmpNode, node;
        NamedNodeMap nodeMap;


        for (int i = 0; i < nodelist.getLength(); i++) {
            tmpNode = nodelist.item(i);
            if (tmpNode.getNodeType() == Node.ELEMENT_NODE) {
                if (tmpNode.getChildNodes().getLength() == 1)


                    System.out.println(tmpNode.getNodeName() + ": "
                            + tmpNode.getTextContent());
                else
                    System.out.println("\n    " + tmpNode.getNodeName() + "\n");
                if (tmpNode.hasAttributes()) {
                    nodeMap = tmpNode.getAttributes();
                    for (int j = 0; j < nodeMap.getLength(); j++) {
                        node = nodeMap.item(j);
                        System.out.println(node.getNodeName() + ": "
                                + node.getNodeValue());
                    }
                }
            }
            
            if (tmpNode.hasChildNodes())
                printNodes(tmpNode.getChildNodes());
        }
        
    }


    private static void addLeistungsnachweis(Document doc, String KursNr,
            String Erg, String GesPunkte, String Dat, String Ver) {
        
        Element Kurs = doc.createElement("Kurs");
        Element Note = doc.createElement("Note");
        Element GesamtPunkte = doc.createElement("GesamtPunkte");
        Element Datum = doc.createElement("Datum");
        Element AnzVersuche = doc.createElement("AnzVersuche");
        
        


        Note.appendChild(doc.createTextNode(Erg));
        GesamtPunkte.appendChild(doc.createTextNode(GesPunkte));
        Datum.appendChild(doc.createTextNode(Dat));
        AnzVersuche.appendChild(doc.createTextNode(Ver));


        Kurs.appendChild(Note);
        Kurs.appendChild(GesamtPunkte);
        Kurs.appendChild(Datum);
        Kurs.appendChild(AnzVersuche);


        Node Leistungsnachweis = 
                doc.getElementsByTagName("Leistungsnachweise").item(0);
        Leistungsnachweis.appendChild(Kurs);
    }


    private static void changeKontodaten(Document doc, String Inhaber,
            String KntNr, String BLZ) {
        Node Kontodaten = doc.getElementsByTagName("Kontodaten").item(0);
        NamedNodeMap attr = Kontodaten.getAttributes();
        Node nodeAttr = attr.getNamedItem("Inhaber");
        nodeAttr.setNodeValue(Inhaber);
        Node KontoNr = doc.getElementsByTagName("KntNr").item(0);
        KontoNr.setNodeValue(KntNr);
        Node blz = doc.getElementsByTagName("BLZ").item(0);
        blz.setNodeValue(BLZ);
    }


    public static void main(String[] args) {
        try {
            File xmlFile = new File(
                    "/EA 3.4/src/NewFile.xml");
            // Ziel für neuen XML-File


            File xmlFileTarget = new File(
                    "/EA 3.4/src/NewFile_new.xml");
            DocumentBuilderFactory dbfactory = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder dBuilder = dbfactory.newDocumentBuilder();
            Document doc = dBuilder.parse(xmlFile);
            doc.getDocumentElement().normalize();
            System.out.println("XML-Dokument "
                    + doc.getDocumentElement().getNodeName());


            System.out.println("-------------------------------");
            if (doc.hasChildNodes())
                printNodes(doc.getChildNodes());


            // neuen Leistungsnachweis einfügen


            addLeistungsnachweis(doc, "01770", "1.7", "88", "23.09.2014", "1");


            // Kontodaten ändern


            changeKontodaten(doc, "Hans Muster", "9876543", "250 100 20");
            printNodes(doc.getChildNodes());


            // Datei als XML-file speichern


            TransformerFactory transformerFactory = TransformerFactory
                    .newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(xmlFileTarget);
            transformer.transform(source, result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }



}
```




Ich bekomme folgende Fehlermeldung:

java.lang.NullPointerException
    at MyDOMParser.addLeistungsnachweis(MyDOMParser.java:81)
at MyDOMParser.main(MyDOMParser.java:124)

Wo liegt mein Fehler? Habe schon viel rumprobiert und komme da nicht weiter.
Vielen Dank im Voraus.

Grüße
Lena


----------



## Dompteur (18. Mai 2015)

Das könnte ein Tipfehler in Zeile 80 sein. Da steht "Leistungsnachweise" mit einem "e" hinten. Im XML hingegen steht "Leistungsnachweis" - ohne "e".
Dadurch findest du natürlich den Knoten, der eigentlich da sein müsste, nicht...


----------



## Lena09 (18. Mai 2015)

Danke! Blöder Fehler, an der Stelle ist es behoben. aber jetzt meckert er an einer anderen Stelle 
Ich werd verrückt :shock:

java.lang.NullPointerException
at MyDOMParser.changeKontodaten(MyDOMParser.java:90)
    at MyDOMParser.main(MyDOMParser.java:130)


----------



## Dompteur (18. Mai 2015)

Im XML finde ich kein Tag oder Attribut namens "Inhaber".


----------



## Lena09 (18. Mai 2015)

Das ist die Variable, die in der Methode deklariert wurde:
private static void changeKontodaten(Document doc, String Inhaber, String KntNr, String blz)
Ist das falsch? Ich komm da echt nicht weiter.


----------



## Dompteur (18. Mai 2015)

Ich beziehe mich auf Zeile 89 aus deinem ersten Beitrag. Dort versuchst du ein XML Element namens "Inhaber" zu lesen.
Daher ist das resultierende Objekt nodeAttr null.


----------



## Lena09 (18. Mai 2015)

Stimmt... Den ganzen Block hatte ich mittlerweile schon abgeändert:

[Java]
private static void changeKontodaten(Document doc, String Inhaber,
            String KntNr, String blz) {
        Node Kontodaten = doc.getElementsByTagName("Kontodaten").item(0);
        NamedNodeMap attr = Kontodaten.getAttributes();
        Node nodeAttr = attr.getNamedItem("Kontoinhaber");
        nodeAttr.setNodeValue(Inhaber);
        Node Kontonummer = doc.getElementsByTagName("Kontonummer").item(0);
        Kontonummer.setNodeValue(KntNr);
        Node BLZ = doc.getElementsByTagName("BLZ").item(0);
        BLZ.setNodeValue(blz);
[/Java]


----------



## Lena09 (19. Mai 2015)

Vielen Dank für deine Hilfe!
Einfügen eines neuen Leistungsnachweises funktioniert soweit. Allerdings bekomme ich das noch nicht hin, mit dem Ändern der Kontodaten.

Die xml Datei von oben. Den Java-Code habe ich etwas abgeändert:

[Java]import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;


import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


public class MyDOMParser {


    private static void printNodes(NodeList nodelist) {


        Node tmpNode, node;
        NamedNodeMap nodeMap;


        for (int i = 0; i < nodelist.getLength(); i++) {
            tmpNode = nodelist.item(i);
            if (tmpNode.getNodeType() == Node.ELEMENT_NODE) {
                if (tmpNode.getChildNodes().getLength() == 1)


                    System.out.println(tmpNode.getNodeName() + ": "
                            + tmpNode.getTextContent());
                else
                    System.out.println("\n   " + tmpNode.getNodeName() + "\n");
                if (tmpNode.hasAttributes()) {
                    nodeMap = tmpNode.getAttributes();
                    for (int j = 0; j < nodeMap.getLength(); j++) {
                        node = nodeMap.item(j);
                        System.out.println(node.getNodeName() + ": "
                                + node.getNodeValue());
                    }
                }
            }


            if (tmpNode.hasChildNodes())
                printNodes(tmpNode.getChildNodes());
        }
    }


    private static void addLeistungsnachweis(Document doc, String KursNr,
            String Erg, String GesPunkte, String Dat, String Ver) {


        Element Kurs = doc.createElement("Kurs");
        Element Note = doc.createElement("Note");
        Element GesamtPunkte = doc.createElement("GesamtPunkte");
        Element Datum = doc.createElement("Datum");
        Element AnzVersuche = doc.createElement("AnzVersuche");


        Kurs.appendChild(doc.createTextNode(KursNr));
        Note.appendChild(doc.createTextNode(Erg));
        GesamtPunkte.appendChild(doc.createTextNode(GesPunkte));
        Datum.appendChild(doc.createTextNode(Dat));
        AnzVersuche.appendChild(doc.createTextNode(Ver));


        Node Leistungsnachweise = doc
                .getElementsByTagName("Leistungsnachweise").item(0);
        Leistungsnachweise.appendChild(Kurs);
        Leistungsnachweise.appendChild(Note);
        Leistungsnachweise.appendChild(GesamtPunkte);
        Leistungsnachweise.appendChild(Datum);
        Leistungsnachweise.appendChild(AnzVersuche);


    }


    private static void changeKontodaten(Document doc, String Inhaber,
            String KntNr, String blz) {


        Node Kontoinhaber = doc.getElementsByTagName("Kontoinhaber").item(0);
        Kontoinhaber.setNodeValue(Inhaber);


        Node Kontonummer = doc.getElementsByTagName("Kontonummer").item(0);
        Kontonummer.setNodeValue(KntNr);


        Node BLZ = doc.getElementsByTagName("BLZ").item(0);
        BLZ.setNodeValue(blz);


    }


    public static void main(String[] args) {
        try {
            File xmlFile = new File(
                    "/Users/workspace/EA 3.4/src/NewFile.xml");


            // Ziel für neuen XML-File


            File xmlFileTarget = new File(
                    "/Users/workspace/EA 3.4/src/NewFile_new.xml");


            DocumentBuilderFactory dbfactory = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder dBuilder = dbfactory.newDocumentBuilder();
            Document doc = dBuilder.parse(xmlFile);
            doc.getDocumentElement().normalize();
            System.out.println("XML-Dokument "
                    + doc.getDocumentElement().getNodeName());


            System.out.println("-------------------------------");


            if (doc.hasChildNodes())
                printNodes(doc.getChildNodes());


            // neuen Leistungsnachweis einfügen


            addLeistungsnachweis(doc, "01770", "1.7", "88", "23.09.2014", "1");


            // Kontodaten ändern


            changeKontodaten(doc, "Hans Muster", "987 654 321", "250 100 20");
            printNodes(doc.getChildNodes());


            // Datei als XML-file speichern


            TransformerFactory transformerFactory = TransformerFactory
                    .newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(xmlFileTarget);
            transformer.transform(source, result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}[/Java]

Was mache ich in der Methode *changeKontodaten* falsch?


----------



## Harry Kane (19. Mai 2015)

Eine Instanz von org.w3c.dom.Element hat keinen nodeValue in dem Sinne. Element.getNodeValue() gibt null zurück, und was Element.setNodeValue(String value) macht, kann ich gerade nicht nachprüfen, weil die Doku  grottenschlecht ist. Die API Dokumentation der setter ist offenbar ein Copy-Paste-Clon der getter-Methoden.:bahnhof:
Versuchs mal mit setTextContent(String content).


----------



## Lena09 (19. Mai 2015)

Super!!! Es läuft!!! Bin so happy, hab schon so viel Zeit für diese Aufgabe verbraucht.
Vielen vielen Dank!


----------

