JDOM: XML einlesen

nils_r

Mitglied
Hallo!

Ich möchte Daten aus einer XML-Datei einlesen und anschliessend in einer Datenbank speichern.
Für das Einlesen der XML Datei möchte ich Jdom verwenden, komme da aber gerade nicht so wirklich weiter.

Eine Beispiel XML-Datei sieht so aus:
Java:
<?xml version="1.0" encoding="iso-8859-1"?>
  <DATA>
    <COMPONENT counter="1">
      <HEADER>
        <META_DATA>
          <PACKAGE_ID>001</CLASS_ID>
          <PACKAGE_TYPE>1</CLASS_TYPE>
        </META_DATA>
        <AUTHOR_DATA>
          <REFERENCE_ID>1</REFERENCE_ID>
          <AUTHOR>
            <AUTHOR_ID>1</SHIPMENT_ID>
            <NAME>MyName</NAME>
          </AUTHOR>
        </AUTHOR_DATA>
      </HEADER>

      <CLASS>
        <CLASS_DATA>
          <CLASS_ID>123</CLASS_ID>
          <CLASS_NAME>MyClass</CLASS_NAME>
        </CLASS_DATA>
      </CLASS>
    </COMPONENT>
  </DATA>
Es können mehrere Components vorhanden sein. Innerhalb der Components gibt es einen Header-Block und ein oder mehrere Class-Blöcke.

Um mit Jdom die Datei zu lesen gehe ich so vor:
Java:
Document doc = null;
FIle f = new FIle("datei.xml");
try {
  SAXBuilder builder = new SAXBuilder();
  doc = builder.build(f);
  
  Element element = doc.getRootElement();
  List<Element> componentList = (List<Element>)element.getChildren();
  for(Element component : componentList) {
    // So würde ichs gerne machen:
    Element header = component.getChild("HEADER");
    String packageId = header.getChild("META_DATA").getChildText("PACKAGE_ID");
    // ...
 
  }

Beim Zugriff auf das Child "Header" fliegt mir eine NullPointerException um die Ohren.
Die getChild() Methode liefert jedes mal NULL, obwohl der übergebene String (im Beispiel "HEADER") im DOM-Baum dort sein müsste.

Was verstehe ich da falsch? Wie kann ich vorgehen?
 
?? Paar copy-paste-Fehler in der XML-Datei? :lol:
[XML]
<PACKAGE_ID>001</CLASS_ID>
<PACKAGE_TYPE>1</CLASS_TYPE>
<!-- .... -->
<AUTHOR_ID>1</SHIPMENT_ID>
[/XML]

/EDIT:
[xml]
<?xml version="1.0" encoding="iso-8859-1"?>
<DATA>
<COMPONENT counter="1">
<HEADER>
<META_DATA>
<PACKAGE_ID>001</PACKAGE_ID>
<PACKAGE_TYPE>1</PACKAGE_TYPE>
</META_DATA>
<AUTHOR_DATA>
<REFERENCE_ID>1</REFERENCE_ID>
<AUTHOR>
<AUTHOR_ID>1</AUTHOR_ID>
<NAME>MyName</NAME>
</AUTHOR>
</AUTHOR_DATA>
</HEADER>

<CLASS>
<CLASS_DATA>
<CLASS_ID>123</CLASS_ID>
<CLASS_NAME>MyClass</CLASS_NAME>
</CLASS_DATA>
</CLASS>
</COMPONENT>
</DATA>
[/xml]

&
Java:
import java.io.File;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

public class JDOMTest {
	public static void main(String[] args) throws Exception {
		Document doc = null;

		SAXBuilder builder = new SAXBuilder();
		doc = builder.build(JDOMTest.class.getResource("datei.xml"));

		Element element = doc.getRootElement();
		List<Element> componentList = element.getChildren();
		for (Element component : componentList) {
			// So würde ichs gerne machen:
			Element header = component.getChild("HEADER");
			String packageId = header.getChild("META_DATA").getChildText(
					"PACKAGE_ID");
			System.out.println(packageId);
		}

	}
}

liefert 001 bei mir ?
 
Zuletzt bearbeitet:
erstmal danke und sorry für den Fehler.

Bei Dir funktionierts? Grundsätzlich sollte es dann so funktionieren wie ich mir das vorgestellt habe?
Das wäre ja schonmal gut, nur ist die Frage wieso ich eine NullPointerException bekomme und Du nicht?
Jetzt bin ich total verwirrt.
 
Naja, stell doch hier mal ein vernünftiges Beispiel rein, welches man nachvollziehen kann und selbst ausführen kann (so wie meins z.B. - dein Java Code oben enthält ja neben den XML-Fehlern auch noch Fehler! )
Ansonsten mal in die JDOM-FAQ geschaut? (JDOM: FAQ)
Gibts evtl. ein namespace ? (das müsstest du bei getChild angeben denke ich) ...wie gesagt, mach ein Beispiel!
 
super es funktioniert! Vielen Dank.
Es lag am Namespace.
In der ursprünglichen XML-Datei war noch ein Namespace angegeben. Hier habe ich nur eine gekürzte Version gepostet, weil ich es übersichtlich halten wollte.
Jetzt habe ich ein Namespace Objekt erstellt und übergebe es der getChild Methode.
Problem ist also gelöst.

Was Jdom jetzt aber mit dem Namespace Objekt anstellt weiß ich nicht und wieso ich ohne den Namespace Fehler bekomme verstehe ich noch nicht. Da muss ich mich dann wohl nochmal näher mit beschäftigen.
 

Zurück
Oben