Aus lesen einer XML-Datei ( 1 root, 3 childs)

darkhawk

Mitglied
Hi, ich finde leider in Beispielen immer nur XML Dateien die 1 Root und 2 Childs haben, aber leider kein drittes. Leider kenne ich mich mit XML und Java nicht so gut aus.

Anbei habe ich ein Beispiel einer XML Datei die ich einlesen möchte und meinen Quellcode, nur irgendwie bekomme ich nur von "Punkt 1" den X-Wert ausgegeben, danach kommt eine "NullPointerException" und die Schleife bricht ab :/

wäre sehr nett wenn mir da jemand helfen könnte

[XML]<?xml version="1.0" encoding="utf-8"?>
<matrix version="2.0">
<row number="1">

<point number="1">
<x>414.9969</x>
<y>-708.5396</y>
<z>-89.1267</z>
</point>
<point number="2">
<x>445.4468</x>
<y>-261.0712</y>
<z>-36.6527</z>

</point>
<point number="3">
<x>441.3276</x>
<y>-138.7316</y>
<z>-18.4372</z>
</point>

</row>
<row number="2">

<point number="2">
<x>424.9969</x>
<y>-708.5396</y>
<z>-89.1267</z>
</point>
<point number="2">
<x>455.4468</x>
<y>-261.0712</y>
<z>-36.6527</z>

</point>
<point number="3">
<x>451.3276</x>
<y>-138.7316</y>
<z>-18.4372</z>
</point>

</row>
<row number="3">

<point number="1">
<x>434.9969</x>
<y>-708.5396</y>
<z>-89.1267</z>
</point>
<point number="2">
<x>465.4468</x>
<y>-261.0712</y>
<z>-36.6527</z>

</point>
<point number="3">
<x>461.3276</x>
<y>-138.7316</y>
<z>-18.4372</z>
</point>

</row>
</matrix>[/XML]

Java:
import java.io.File;

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

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
public class test {
	public static void main(String argv[]) {
		try {
			
			File xmlDatei = new File("C:/Users/admin-32/Desktop/Matrix.xml");
			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
			Document doc = dBuilder.parse(xmlDatei);
			doc.createDocumentFragment().normalize();		
			
			NodeList MatrixList = doc.getChildNodes();
			Node Matrix = MatrixList.item(0);
			
			
			NodeList Rows = Matrix.getChildNodes();
			for (int i=1; i<Rows.getLength();i++) {
				Node Row = Rows.item(i);
			
				NodeList Punkte = Row.getChildNodes();
				for (int j=1; j<Punkte.getLength();j++) {
					Node Punkt = Punkte.item(j);
			
					NodeList Koordinaten = Punkt.getChildNodes();
					for (int k=1; k<Koordinaten.getLength();k++) {
						Node Koordinate = Koordinaten.item(k);
						System.out.println(Koordinate.getFirstChild().getNodeValue());
					}
				}
			}
	
			System.out.println("-----------------------");
	

		  } catch (Exception e) { e.printStackTrace();}
	  }

}
 
N

nillehammer

Gast
Also bei allen Iterationen mit Index geht es normalerweise bei 0 los und nicht bei 1. Würde mich sehr wundern, wenn es bei NodeList anders wäre. Aus den javadocs ist das zumindest nicht ersichtlich. Probier also mal, Deine Schleifen mit i,j,k=0 los laufen zu lassen.
 

darkhawk

Mitglied
Hi, ich hatte anfangs auch alle bei 0 starten lassen das funktionerte nicht....

habe jetzt mal bischen was per Hand ausprobiert und bin auf dieses merkwürdige Ergebnis gestoßen:
Die Schleifenvariablen i,j,k dürfen nur ungerade Werte annehmen, also 1,3,5 dann klappt es irgendwie, aber ist das NORMAL ??? Irgendwas muss ich doch hier falsch machen oder Zählt java von alleine irgendwie mit hoch ??

Java:
for (int i=1; i<Rows.getLength();i++) {
                Node Row = Rows.item(i);
                i++;
                NodeList Punkte = Row.getChildNodes();
                for (int j=1; j<Punkte.getLength();j++) {
                    Node Punkt = Punkte.item(j);
                    j++;
                    NodeList Koordinaten = Punkt.getChildNodes();
                    for (int k=1; k<Koordinaten.getLength();k++) {
                        Node Koordinate = Koordinaten.item(k);
                        System.out.println(Koordinate.getFirstChild().getNodeValue());
                        k++;
                    }
                }
            }
 
N

nillehammer

Gast
Hmm, sehr strange. Java zählt eigentlich nix von sich aus hoch. Und auch bei dem index=0 bin ich mir ziemlich sicher. sonst würde diese Zeile ja auch nicht funktionieren:
Java:
Node Matrix = MatrixList.item(0);
Und die Javadoc-Beschreibung macht das auch deutlich, dass der Index bei 0 losgeht. Siehe hier:NodeList#getLength()

Ansonsten ist mir nur ein unnötiges Statement in Deinem Code aufgefallen. Ersetze Zeile 17
Java:
doc.createDocumentFragment().normalize();
durch das hier:
Java:
doc.normalizeDocument();

Ach ja, und Variablennamen (row, punkt, koordinate) bitte klein geschrieben. Aber das ist nur eine Stilfrage und hilft dir bei Deinem Problem nicht weiter...
 
Zuletzt bearbeitet von einem Moderator:
N

nillehammer

Gast
Ahh ok, jetzt hab ich das mit dem Index gerafft. Das Attribut des jeweiligen Elements (number) ist wahrscheinlich das erste Child. Danach kommen erst die Child-Elemente. Deswegen war es schon richtig, den Index bei 1 loslaufen zu lassen. Das könnte auch der Grund sein, warum die Iteration insgesamt nicht funktioniert. Vielleicht hat er noch andere Nodes in der NodeList als die, die Du denkst. Lass Dir mal das Ergebnis von getLength() ausgeben, wenn das größer als der erwartete Wert ist, hast du noch andere Sachen in der NodeList.
 
Zuletzt bearbeitet von einem Moderator:

darkhawk

Mitglied
Danke... werde das mit den Variablennamen mir mal angewöhnen.

Habe jetzt auch meine Zeile 17 durch das ersetzt
Java:
doc.normalizeDocument();


Die Länge ist jeweils 7 das könnte irgendwie stimmen mit dem ersten CHild "number". Dann darf da ja keiner was an den Attributen ändern, sonst passen meine Schleifen ja garnicht. Kann ich das irgendwie umgehen, dass der die Attribute "number" und vlt andere die noch hinzukommen könnten nicht mitzählt?
 
N

nillehammer

Gast
Da gibt es viele Möglichkeiten. Du könntest so wie jetzt durch alle children iterieren, aber nur die children auswerten, die Elemente sind. Das bedeutet die wenigsten Änderungen an Deinem Code. Ist aber unsicher, wenn jemand unerwartete Elemente einfügt. Das sähe dann so aus:
Java:
//... Code wie bisher ...//
// Hier der veränderte Code //
for (int i=1; i<Rows.getLength();i++) {
                Node Row = Rows.item(i);
                 // Wenn child kein Element, dann abbrechen und mit nächstem child weiter machen.
                if (Node.ELEMENT_NODE!= Row.getNodeType(){
                  continue;
                }
                NodeList Punkte = Row.getChildNodes();
                for (int j=0; j<Punkte.getLength();j++) {
                    Node Punkt = Punkte.item(j);
                    // Wenn child kein Element, dann abbrechen und mit nächstem child weiter machen.
                    if (Node.ELEMENT_NODE!= Punkt.getNodeType(){
                      continue;
                    }
                    NodeList Koordinaten = Punkt.getChildNodes();
                    for (int k=0; k<Koordinaten.getLength();k++) {
                        Node Koordinate = Koordinaten.item(k);
                        // Wenn child kein Element, dann abbrechen und mit nächstem child weiter machen.
                        if (Node.ELEMENT_NODE!= Koordinate.getNodeType(){
                          continue;
                        }
                        System.out.println(Koordinate.getFirstChild().getNodeValue());
                    }
                }
            }
    
            System.out.println("-----------------------");
    
 
          } catch (Exception e) { e.printStackTrace();}
Eine andere Möglichkeit wäre, mit Element statt mit Node zu arbeiten. Das ist noch etwas sicherer. Jetzt können auch unerwartete Elemente nichts kaputt machen. Fehlende natürlich schon. Das sähe dann so aus:
Java:
          // Wir wissen, dass MatrixList.item(0) ein Element zurück liefert. Deswegen können wir casten.
          Element Matrix = (Element) MatrixList.item(0);
            
            // So kriegen wir nur Elemente mit Tag-Namen "row" alles andere bleibt draußen.
            NodeList Rows = Matrix.getElementsByTagName("row");
            for (int i=0; i<Rows.getLength();i++) {
                // Rows enthält nur Element, wir können gefahrlos casten.
                Element Row = (Element) Rows.item(i);
            
                NodeList Punkte = Row.Matrix.getElementsByTagName("point");
                for (int j=0; j<Punkte.getLength();j++) {
                    Element Punkt = (Element) Punkte.item(j);
                    Node x = Punkt.getElementsByTagName("x").item(0);
                    Node y = Punkt.getElementsByTagName("y").item(0);
                    Node z = Punkt.getElementsByTagName("z").item(0);
                    System.out.println(x.getFirstChild());
                    System.out.println(y.getFirstChild());
                    System.out.println(z.getFirstChild());
                }
            }
    
            System.out.println("-----------------------");
    
 
          } catch (Exception e) { e.printStackTrace();}
      }
Eine letzte Möglichkeit wäre die Nutzung von XPATH.
 
Zuletzt bearbeitet von einem Moderator:

darkhawk

Mitglied
Danke :))

letzteres mir den Elementen klingt sehr gut. Es dürfen eh nur weitere Punkte mit allen Koordinaten hinzugefügt werden und es werden auch immer alle Koordinaten gebraucht.

ich danke dir
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B XML aus einer URL im Internet lesen (JDOM) XML & JSON 4
B Klassen mit generischen Attributen mit Jackson lesen XML & JSON 4
H XMLConfiguration(1.10)/getString : Wert "E" aus <version type="Auto">E</version>n lesen XML & JSON 15
C einfach XML lesen XML & JSON 4
JBoby Yaml File lesen und in Objekte umwandel (SnakeYAML / YamlBeans) XML & JSON 0
E Einzelne Tags der context.xml lesen XML & JSON 1
W Json von URL Lesen (mit Gson Library) XML & JSON 3
W Json von URL Lesen XML & JSON 2
G Jsoup Daten lesen XML & JSON 0
F KindElemente lesen und begrenzen XML & JSON 0
P Bestimmte XML-Inhalte in String lesen XML & JSON 2
P Komfortabel XML Dokumente schreiben und lesen XML & JSON 6
Maxim6394 Lesen/Schreiben von XML Datei XML & JSON 9
R XLM Datei lesen Ändern (kompliziertes Search and Replace) und Speichern XML & JSON 12
S XML lesen und schreiben XML & JSON 2
Q Atom/RSS-Feed lesen - per XSD zu Java-Code XML & JSON 4
K JAXB: Klassen mit Annotation Lesen/Schreiben XML XML & JSON 3
O PDF mit Pdfbox lesen XML & JSON 3
S XMLStreamReader, letzten eintrag eines xml lesen? XML & JSON 5
N MalformedByteSequenceException bei Lesen aus XML Datei XML & JSON 2
Mike90 Daten aus DB in ExcelTabelle lesen + bearbeiten + formatieren XML & JSON 2
Mike90 -xlsx Dateien in Java lesen XML & JSON 3
Fadi .classpath(XML) mit Java lesen XML & JSON 2
J Problem beim XML-Lesen XML & JSON 2
J Logdaten als XML speichern und lesen XML & JSON 2
J XML lesen schreiben XML & JSON 7
N jdom problem beim lesen von child elementen XML & JSON 5
N problem bei xml lesen mit jdom XML & JSON 2
T Xml lesen und in .txt zeilenweise schreiben XML & JSON 4
L Einfaches XML Lesen und Schreiben XML & JSON 4
C SAX Probleme beim lesen XML & JSON 4
O OpenDocument-Tabelle mit Java lesen und schreiben XML & JSON 3
R key aus xml lesen mittels jdom XML & JSON 5
F XML ( ca. 280 MB) JDom & SAXBuilder lesen = OutOfMemoryE XML & JSON 4
O XML lesen, wenn DTD in anderem Verzeichnis XML & JSON 2
R Daten aus xml lesen und in Strings speichern XML & JSON 4
R xml mit Jdom lesen und als Jtree anzeigen. XML & JSON 9
J Jdom Elemente lesen XML & JSON 5
thE_29 Vor dem ersten Posten bitte lesen! XML & JSON 0
W Erzeugen einer openapi spec via swagger XML & JSON 1
W Erzeugen einer Handlerklasse zum Abfangen von SOAP-Requests XML & JSON 13
D Innerhalb einer Property auf eine andere verlinken? XML & JSON 3
J Auslesen der Länge einer XML-Datei in Android Studio XML & JSON 8
S Validierung einer XML-Datei - Führende Leerzeichen und Tabs XML & JSON 10
M Layout + Inhalt einer JTable speichern XML & JSON 30
J Welche Gründe führen zu einer endlos tiefen XML? XML & JSON 4
T Pfad in einer Variablen speichern XML & JSON 1
E Wie kann ich ein XSD-Schema in einer JSP-Seite verwenden? XML & JSON 7
T Visualisierung von XML Dateien in einer Java SwingGui XML & JSON 11
R XSD in einer choice mehrmals das selbe element möglich XML & JSON 5
S Xml File für den Aufbau einer anderen Xml Datei XML & JSON 6
C XPath: Alle Kinder in einer Schleife auslesen XML & JSON 2
K Beim Parsen einer XML-Datei Connection timed out XML & JSON 4
F Parsen von Daten aus einer Homepage XML & JSON 6
B SAX-Parser - Dokumente einlesen und in einer Map ablegen XML & JSON 2
B 2 Attribute in einer xsl XML & JSON 2
T Inhalt einer .xml Datei auf Javaoberfläche wiedergeben XML & JSON 4
T Schreiben einer XML XML & JSON 8
B XML auf Basis einer DTD erstellen XML & JSON 2
hdi Probleme beim Erstellen einer XML XML & JSON 7
O Parsen einer XML mit JDOM ohne Doctype Declaration XML & JSON 2
T XPath Problem: finden einer Node nach Attributswert XML & JSON 2
sylo Mehrere XSDs und mehrere Namensräume in einer XML unterbringen? XML & JSON 2
Nicer Bestimmten Wert aus einer XML Auslesen XML & JSON 34
sylo Beim Erzeugen einer XML Datei auch die XML Struktur erzeugen? XML & JSON 11
J xmlencoder Zustände einer Bean schreiben XML & JSON 3
N value Wert einer XML Datei mit JAVA bearbeiten XML & JSON 21
S Probleme beim erstellen einer Jar XML & JSON 12
J Problem mit compile einer XSD XML & JSON 3
S Einlesen einer xml Datei XML & JSON 4
F hilfe bei einer aufgabe XML & JSON 3
D Anzahl der Knoten in einer XML XML & JSON 6
R Parsen einer XML ohne Validierung XML & JSON 2
D XML Datei innerhalb einer JAR Datei parsen XML & JSON 2
M Xerces -Parsen mit einer externen Schemadatei geht nicht XML & JSON 2
cybermat Ergebnis einer XSLT-Tansformation als Rückgabewert erhalten XML & JSON 4
J Fehler beim laden einer .xml XML & JSON 3
ven000m Übungsaufgabe: Valide und gültige XML Datei zu einer DTD XML & JSON 7
A Auslesen einer XML Datei XML & JSON 58
P OutOfMemoryError beim Einlesen einer XML-Datei XML & JSON 7
P Knoten-Attribute einer xsd-Datei in einem JTree auslesen XML & JSON 18
T Einfach nur die Elemente einer XML Datei auslesen :( XML & JSON 10
Z Erzeugung einer Referenz von Knoten in JTree auf DOMTree XML & JSON 3
A Element an einer bestimmten Stelle einfügen (nicht am Ende) XML & JSON 4
T Tags in XML Datei mit Java erstellen XML & JSON 3
S XML Datei speichern nicht möglich XML & JSON 13
M Objekt zu jsonArray in .json datei hinzufügen ? XML & JSON 3
J Object in JSON Datei einlesen und als neues Object erzeugen (in ein Object Array) XML & JSON 29
I Mit Hibernate eine XML-Datei in eine Tabellenspalte einlesen. XML & JSON 1
MiMa Buch Metadaten aus XML Datei parsen XML & JSON 48
R xlsx-Datei mit Apache POI einlesen XML & JSON 18
S CSV Datei einlesen und XML Ausgeben XML & JSON 2
U jar Datei mit ant erstellen XML & JSON 1
P wie kriege ich eine *.dtd Datei mit in die ausführbare *.jar? XML & JSON 2
K XML Datei erstellen und Daten daraus in Java auslesen XML & JSON 6
D XML-Datei per Button erstellen XML & JSON 3
K JAR-File mit XML-Datei XML & JSON 1
M Text eines Elements in XML Datei mit JAVA bearbeiten und kompletten Element-Zweig hinzufügen XML & JSON 16
I Liste in YAML Datei speichern und wieder auslesen XML & JSON 1
A Leeres Array beim Auslesen von XML-Datei XML & JSON 4

Ähnliche Java Themen

Neue Themen


Oben