XML mit Java parsen XPath vs Tree

Hallo!

Seit einiger Zeit versuche ich schon ein XML Dokument zu parsen. Die Hierarchie geht dabei auf ca. 8 Ebenen tief.
Ich möchte im Grunde genommen, die Struktur des XML als Baum speichern. Ich habe auch eine Klasse Tree (von Google Inc. 2007). Das Dokument „lese“ ich mit XPath. Dabei lassen sich die Elemente auch ausgeben - allerdings nicht hierarchisch geordnet.

Und daher möchte ich „einfach“ die Elemente des XML Dokuments als Baum speichern, so dass mir für spätere Verwendung auch die genauen Pfadangaben quasi erhalten bleiben … und genau das geht nicht. Stattdessen erstellt er mir im src-Ordner eine core.XXXX.XXXX-Datei und Fehlermeldungen (JVMDUMP039I / JVMDUMP032I).

Weiß jemand Rat?
Danke im Voraus! :smile:

LG,
EV*A

Um XML in eine Baumstruktur zu parsen, eignet sich JDOM ganz gut. Dort muss man prinzipiell nur das file reinwerfen und es gibt eine hierarchische Struktur aus.
Versuch es vllt damit.

Hallo EV*A,

hast du uns die Sourcecodes und die genauen Meldungen dazu?

Gruß

hier bei Google gibts Beispiele, wie z.B. das hier, um die Elemente zu durchlaufen.

=> http://java.happycodings.com/XML/code18.html

hier muss dann deine Logik rein mit dem Tree-Objekt, der traverseNode-Funktion musst du noch dein „Eltern“-Objekt geben, damit du deinen Baum erweitern kannst.

Ich denke dass müsste dir den Weg weisen und dich weiterbringen.

Das XML Document sollte mit einem parser (javax.xml.parsers) eingelesen werden. Ein DocumentBuilder erzeugt beim Parsen ein Document objekt, welches den gesamten XML Inhalt als Objekt-Baum beinhaltet.

Hier holt man sich dann das oberste Element:

Node rootNode = document.getDocumentElement();

über das Node Objekt kann man auf den Element Namen, Attribute, Text, etc. zugreifen

z.b. String nodeName = rootNode.getNodeName();

und eben auch auf die untergeordneten Elemente:

NodeList ndListChilds = rootNode.getChildNodes();

diese dann einfach mit einer rekursiven Funktion durchlaufen:

z.b. walkXml( Node parent ) {
NodeList nodeList = parent.getChildNodes();
if (null == nodeList) return;
for(int i=0; i Objekt überhaupt notwendig ist.

Hallo,

über xml Dom lässt sich dass einfach machen.
Siehe
http://people.apache.org/~edwingo/paper-html/paper.htm
Gruß
Richard

Hallo!

Danke für die schnelle Antwort!

Wie beschrieben ist das Problem nicht das durchlaufen der Elemente - mit XPath habe ich das ja bereits bewerkstelligt. Die Frage ist vielmehr ob es möglich ist, das Ergebnis der XPath-Expression in einem Baum zu speichern …

Wäre das prinzipiell möglich angesichts der verschiedenen Speicherstrukturen?

LG,
EV*A

Hallo EV*A

Document doc = null;

doc = new SAXBuilder().build( ".\\test.xml" );

Element rootElement = doc.getRootElement();

ist das nicht bereits was du willst? rootElement wäre in dem Fall der Anfang deines Baums. mit rootElement.getChildren bekommst du alle direkten Unterelemente.

Hallo!

Danke für die Antwort!
Meine Frage bezieht sich in erster Linie auf XPath - damit spreche ich ja die Elemente an. Frage: kann ich bzw. wie kann ich die dann in den Baum speichern …?

Wenn ich das mache, dann kommt bei mir nämlich die erwähnte Fehlermeldung(en).

LG

Hmm… steh gerade noch auf dem Schlauch.
Soll der XML-Baum als Ordnerstruktur im Projekt angelegt werden, oder in das Tree-Objekt?

Welches Tree-Objekt ist das genau? Hinter dem Link sind so viele.

Gruß

Hi, EV*A

http://xmlbeans.apache.org/

ist, was ich bei solchen Aufgaben einsetze, wenn ich ein XML-Schema für meine XML-Daten habe.

Wenn ich keines habe, mache ich mir eines. XML direkt parsen, ohne Schema - nee, da kenne ich mich nicht aus und würde es auch nicht in Erwägung ziehen.

Gruß

Rolf

XPath kenne ich zwar nicht, um dir sagen zu können was du falsch machst.

ich habe für XML _immer_ XSTREAM [1] verwendet. damit kannst du
bestehendes XML in eine java datenstruktur ‚umwandeln‘
oder java objekte als xml abspeichern (also serialisieren und deserialisieren)

ich hoffe, dass dir das hilft.

[1] http://xstream.codehaus.org/

Hallo!

So rufe ich das Programm auf:

import java.io.File;
import javax.swing.JOptionPane;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

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

public class XMLParser
{
static Document xmltree;
static Tree t1;

public static void main(String[] args)
{
try
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder format = factory.newDocumentBuilder();

File file = new File(„file.xml“);

if(file.exists())
{
xmltree = format.parse(file);
xmltree.getDocumentElement().normalize();

t1 = new Tree(xmltree.getDocumentElement());

Node node = xmltree.getDocumentElement();

Parser(node);

Tree t2 = t1.getTree(xmltree.getDocumentElement());

System.out.println(t2.toString());
}
else
{
JOptionPane.showMessageDialog(null,„The file doesn’t exist!“,„Error“,JOptionPane.WARNING_MESSAGE);
}

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

}

public static void Parser(Node node, NodeList nodeList)
{
for (int i = 0; i

Hallo!

Vollständigkeitshalber - so sieht der Code mal aus zum Aufrufen:

import java.io.File;
import javax.swing.JOptionPane;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

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

public class XMLParser
{
static Document xmltree;
static Tree t1;

public static void main(String[] args)
{
try
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder format = factory.newDocumentBuilder();

File file = new File(„file.xml“);

if(file.exists())
{
xmltree = format.parse(file);
xmltree.getDocumentElement().normalize();

t1 = new Tree(xmltree.getDocumentElement());

Node node = xmltree.getDocumentElement();

Parser(node);

Tree t2 = t1.getTree(xmltree.getDocumentElement());

System.out.println(t2.toString());
}
else
{
JOptionPane.showMessageDialog(null,„The file doesn’t exist!“,„Error“,JOptionPane.WARNING_MESSAGE);
}

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

}

public static void Parser(Node node, NodeList nodeList)
{
for (int i = 0; i

Hallo,

sorry, mit XPath habe ich noch nicht gearbeitet. Das erscheint mir für viele Anwendungsfälle zu kompliziert zu sein.

Ich verwende JDOM und würde das auch hier empfehlen. JDOM liest die XML-Datei vollständig in eine Baumstruktur ein. Auf der kann man dann recht einfach mit seinem Programm arbeiten. XPath ist damit auch möglich, wenn’s denn sein muss.

Hi EV*A,

hast du mir ein Beispielfile dazu ?
Ich denke, es hängt an der Notation des Filters „/*/descendant::*“ der kommt mir komisch vor, ansonten lässt sich das Programm bei mir ausführen und landet in einer Endlosschleife mit einer test.xml.

Ich habe die Zeile mit dem evaluate durch NodeList nodeList = node.getChildNotes() ersetzt und es hat funktioniert?

Vielleicht hilft dir das weiter.

Grüße

1 Like

Hallo Eva
Deine Angaben, was Du genau tun willst, sind für mich nicht sehr genau. Ich müsste schon noch mehr wissen, was Du geanu tun willst.

Grundsätchlich verwende ich allerdings JAXB für das Marshalling von XML Dokumenten in Pojos. Auch wenn Du von Speichern schreibst, meinst Du damit eine Datenbank? In dem Falle würde ich die Pojos mit JPA auf die Datenbank speichern.

Aber eben, die Angaben sind leider nicht allzu genau, so dass dies vielleicht „sinnlose“ Tips bzw. Vorschläge sind.

LG,
Stephan

Hallo!

Habe mich nun von XPath gelöst und verwende (zum ersten mal) JDOM.
Und habe schon ein Problem :smile:

Inzwischen habe ich das JDOM-File runtergeladen, entzippt und via „Externe Properties“ eingefügt (in Eclipse). Interessanterweise lässt sich aber „import org.jdom2.Element“ nicht einfügen … (Version jdom-2.0.5.)

Der SAX Builder und Document ließen dafür problemlos importieren.

Hast du vll eine Ahnung was ich übersehe?

Danke!

LG,
EV*A

Hi,

möglicherweise hast du die lib nicht richtig eingebunden. Das geht über rechtsklick auf das Projekt im projekt-explorer->build path->configure build path.
Dort oben die Registerkarte „Libraries“ auswählen und rechts per „Add external jar“ die lib (das/die jar-files) einbinden.

Sollte das alles richtig sein gibt es noch einen Trick: Definiere dir im Quellcode einfach ein jdom-element:

Element element;

ohne imports zu deklarieren und warte bis eclipse es dir rot unterstreicht (weil es keinen im port findet). Dann die maus auf das unterstrichene Element bewegen und kurz warten, dann öffnet sich ein Menü mit Auto-Korrekturen. Ist die lib richtig eingebunden, ist eine der Fehlerlösungen die in der Liste angezeigt werden „Add import org.jdom…“. Wenn du das auswählst funktioniert es dann.

Ich hoffe du kommst damit schon mal ein Stück weiter :smile:

Grüße,

Frederic

1 Like

Hallo!

Der Tipp hat geklappt (Element element:wink:.

Danke! :smiley:

LG,
EV*A