DOM Parser Implementieren

Lena09

Mitglied
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:




Java:
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
 
Zuletzt bearbeitet:

Dompteur

Top Contributor
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

Mitglied
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)
 
Zuletzt bearbeitet:

Lena09

Mitglied
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

Top Contributor
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

Mitglied
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]
 
Zuletzt bearbeitet:

Lena09

Mitglied
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?
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
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).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M SAX Parser implementieren XML & JSON 2
pkm Gibt es XML-Parser-Bibliotheken XML & JSON 3
B XML-Daten mit SAX Parser verarbeiten in Java XML & JSON 4
MiMa SAX-Parser beenden? XML & JSON 5
K GSON-Parser XML & JSON 6
K XML-Parser vs. XLST XML & JSON 4
E Gibt es denn einen XML-Parser für JUnit-Tests? XML & JSON 6
D XSD Parser XML & JSON 1
T Neuer XML Parser!!! XML & JSON 33
J XML Parser anhand xsd erzeugen XML & JSON 2
H SAX Parser optimieren XML & JSON 5
H Sax Parser verschluckt teile XML & JSON 11
C XML SAX Parser XML & JSON 10
R Handler-Wechsel, SAX Parser bricht nach 8192 Byte ab XML & JSON 5
B SAX-Parser - Dokumente einlesen und in einer Map ablegen XML & JSON 2
S Sax Parser Performance XML & JSON 2
M Eigener XML-Parser XML & JSON 1
S Typsicherer HTML-Parser XML & JSON 5
S HTML Parser XML & JSON 2
B Parser und Fabrik XML & JSON 6
F SAX Parser siehe nichts auf dem Konsole weder eine Fehlermeldung noch eine Ergebnis XML & JSON 6
enne87 SAX-Parser XML & JSON 5
C Mit SAX Parser XML Attribute auswerten XML & JSON 3
H XML-Parser: geparste Strings in Konstruktor? XML & JSON 9
S DOM Parser XML & JSON 12
S Sax Parser XML & JSON 3
D Speicherüberlauf bei character-Methode mit SAX-Parser XML & JSON 3
Y Welchen XML Parser / Klassen aus XSD generieren lassen XML & JSON 4
H Brauche ich einen speziellen XML-Parser? XML & JSON 2
M Unhierarchisches XML-File mit DOM-Parser auswerten XML & JSON 5
G XML Parser Fehler, zwei gleiche kind-Elemente XML & JSON 7
S Welcher XML-Parser am besten? XML & JSON 4
S Parser XML & JSON 2
S JAVA XML Parser der einen String parst XML & JSON 3
Noar XML-Parser mit GUI? XML & JSON 2
R Problem mit SAX-Parser characters() XML & JSON 7
K SAX Parser Character Puffer zu klein XML & JSON 2
B Mit Sax-Parser validieren XML & JSON 7
Wildcard xpath Parser XML & JSON 8
O JAXB generierte Klassen sollen Serializable implementieren XML & JSON 1
J Kann ich das so implementieren? XML & JSON 10

Ähnliche Java Themen

Neue Themen


Oben