Mit Java XML parsen

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

Hallo EV*A,

Ich habe auch eine Klasse Tree (von Google Inc.2007).
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.

Fehler in geheimem Code zu finden ist immer schierig, ein Quick ‚n‘ Dirty Beispiel mit der angegebenen Tree Klasse fuktioniert bei mir einwandfrei

public class TreeTest {

 public static void main(String[] args) {

 Tree t = new Tree("root");

 Tree child1 = t.addLeaf("element\_1");
 child1.addLeaf("subelement\_1");
 child1.addLeaf("subelement\_2");

 Tree child2 = t.addLeaf("element\_2");
 child2.addLeaf("subelement\_1");
 child2.addLeaf("subelement\_2");

 System.out.println(t);

 }
}

Ausgabe:

root
 element\_1
 subelement\_1
 subelement\_2
 element\_2
 subelement\_1
 subelement\_2

Stattdessen erstellt er mir im src-Ordner eine
core.XXXX.XXXX-Datei und Fehlermeldungen (JVMDUMP039I /
JVMDUMP032I).

Die JVM gibt einen Core dump aus? Reproduzierbar? Wie wird das Programm denn gestartet?

Gruß
Heavy

Hallo!

So rufe ich das Programm (basierend auf die Klasse Tree) 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,

deine Parser-Methode berücksichtigt das übergebene Node-Objekt im XPath Ausdruck überhaupt nicht sondern ermittelt die NodeList immer auf Basis des gesamten Dokumentes. Daher läuft dein Programm in eine Endlosschleife:

public static void Parser(Node node) 
{
 try
 {
 XPath xpath = XPathFactory.newInstance().newXPath();
 String expression = "/\*/descendant::\*";

 // xmltree ist immer das Originaldokument
 NodeList nodeList = (NodeList)xpath.evaluate(expression, xmltree, XPathConstants.NODESET);


 for (int i = 0; i 

Den catch-Block leer zu lassen ist übrigens auch keine gute Idee, du bekommst so ja gar nicht mit wenn ein Fehler auftritt. Zumindest ein System.err.println(e.getMessage(); und e.printStrackTrace() sollte da rein (alternativ ein Logging Framework nutzen).

Wenn du statt des XPath Ausdrucks einfach die ChildNodes ermittelst solltest du einen Schritt weiter sein:



    
    NodeList nodeList = node.getChildNodes();




HTH
Heavy
1 Like