JTreedaten in eine XML Datei speichern

Elmishelmi

Mitglied
Hi,

ich habe mir einen JTree erstellt und möchte die Daten von diesem in eine XML Datei schreiben. Die Daten des JTree's kommen aus einer XML Datei die ich zuvor geladen und dann geparsed habe. Ich habe einiges versucht, um die Daten wieder in ein XML Dokument zu schreiben. Doch es gelingt mir nicht die Daten nach dem ändern des JTree's wieder in eine XML zu schreiben.

Kann ich die geparsten Daten nicht einfach in eine Datei schreiben, in dem ich das Dokument oder das Rootelement mit den Kindelementen übergebe, inklusive der bearbeiteten Elemente?
Oder muss ich das TreeModel übergeben? Falls ja, an welcher Stelle müsste ich das tun, dort wo ich das TreeModel erstelle?

Die Daten müssen in der XML Datei, wie in der Ursprungsdatei dargestellt werden, deshalb fällt XStream raus.

Kann mir jemand sagen wie ich die Daten von dem JTree wieder in ein Dokument bekomme?

Was ich bereits versucht habe und nicht wie gewünscht funktioniert hat, habe ich auskommentiert. XStream habe gelöscht, weil die Lösung nicht wie gewünscht war.

Danke schon mal im voraus für alle Infos, komme an der Stelle nicht weiter.

Hier mein Code:
Code:
package Model;

import java.io.File;

import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

//Das TreeModel liest das Dokument ein und überführt die Daten anschließend in einen Baum
public class MyTreeModel {
   
    Document doc;
   
    // Datei werden aus dem Dokument geladen und die Baumwurzel wird erstellt
    public void synchronizeXmlWithModel(File file, DefaultMutableTreeNode root) {

        try {
           
            Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
            root.setUserObject(file.getName());
            buildTreeModelByTreeWalk(doc, root);
           
            //Funktioniert nur beim Laden der Datei.
            /*
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(new File("abc.xml"));
            transformer.transform(source, result);
            */   
           
        } catch (Exception e) {
           
            e.printStackTrace();
       
        }
    }

    // Der Parser durchsucht die geladene Datei und prüft um welchen
    // Knotentyp(NodeType) es sich handelt und
    // fügt die einzelnen Knoten(node) dem Baumknoten(treeNode) hinzu.
    public void buildTreeModelByTreeWalk(Node node, DefaultMutableTreeNode parentTreeNode) {
       
        DefaultMutableTreeNode treeNode = new DefaultMutableTreeNode();
        switch (node.getNodeType()) {

        case Node.COMMENT_NODE: {
            treeNode.setUserObject(node.getTextContent());

            // TestAusgabe der Baumwurzel, dient der Parserüberprüfung
            // System.out.println(treeNode);

        }
            break;

        case Node.ELEMENT_NODE: {
            if (treeNode.isLeaf() == true) {

                treeNode.setUserObject(node.getNodeName());
                NamedNodeMap attributes = node.getAttributes();
                int numAttrs = attributes.getLength();

                for (int i = 0; i < numAttrs; i++) {

                    Attr attr = (Attr) attributes.item(i);
                    String attrName = attr.getNodeName();
                    String attrValue = attr.getNodeValue();

                    // Ausgabe der Attributnamen und Werte, dient der
                    // Parserüberprüfung
                    treeNode.setUserObject(node.getNodeName());
                    treeNode.add(new DefaultMutableTreeNode(attrName));
                    treeNode.add(new DefaultMutableTreeNode(attrValue));
                                       
                }
            }

        }
            break;

        case Node.TEXT_NODE: {

            String textContent = node.getTextContent().trim();
            if (textContent.equals("")) {

                return;
            }

            treeNode.setUserObject(textContent);

            // Testausgabe des Knoteninhalts, dient der Parserüberprüfung
            // System.out.println(treeNode);
        }
            break;
        }

        parentTreeNode.add(treeNode);

        if (node.hasChildNodes()) {

            NodeList list = node.getChildNodes();

            for (int i = 0, len = list.getLength(); i < len; i++) {

                buildTreeModelByTreeWalk(list.item(i), treeNode);
               
            }
        }
    }
   
    public void writeFile(File file, DefaultMutableTreeNode root, DefaultTreeModel model) throws TransformerException, ParserConfigurationException {
       
        //Bekommt die Dokumentdaten und
        //schreibt die Daten in einen neuen XML File,
        //Doc bleibt leer.
        /*
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(new File("abx.xml"));
        transformer.transform(source, result);
       
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        Document doc = factory.newDocumentBuilder().newDocument();

        // Get tree root...
        root = (DefaultMutableTreeNode) model.getRoot();

        buildTreeModelByTreeWalk(doc, root);
         // Save the document to disk...
        Transformer tf = TransformerFactory.newInstance().newTransformer();
        tf.setOutputProperty(OutputKeys.INDENT, "yes");
        tf.setOutputProperty(OutputKeys.METHOD, "xml");
        tf.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");

        DOMSource domSource = new DOMSource(doc);
        StreamResult sr = new StreamResult(new File("TreeModel.xml"));
        tf.transform(domSource, sr);
         */

    }
}
 

Harry Kane

Top Contributor
Die Instanzvariable doc in deiner MyTreeModel-Klasse wird in deiner synchronizeXmlWithModel-Methode nicht verwendet bzw. initialisiert, sondern du baust deinen Baum aus einer neuen Instanz von Document auf, die in der Methode erzeugt wird. je nachdem was sonst noch in der Klasse passiert, kann es sein, das doc null ist, wenn du die writeFile Methode aufrufst.
Mir erschliesst sich übrigens nicht, warum du in deiner writeFile-Methode, nachdem du mit transformer.transform(source, result) die XML Datei geschrieben hast, eine neue doc-variable anlegst, die ebenfalls nur in der Methode existiert, und damit nochmal die buildTreeModelByTreeWalk methode aufrufst. Da doc ein "frisches" Document ohne Kindelemente ist, sollte danach eigentlich der JTree leer sein. Ist das beabsichtigt?
 

Elmishelmi

Mitglied
Zu spät vor dem Posten gesehen, sorry. Die Instanzvariable habe ich für einen Test benutzt. Ich wollte die Daten des Doc der Methode synchronizeXmlWithModel-Method an die Methode WriteFile übergeben. Das hat allerdings nicht geklappt. Wie du schon sagtest ist Doc null.

Ich bin noch neu in Java und wenn etwas nicht funktioniert probiere ich ein bisschen was aus, auch wenns wie in diesem Fall keinen Sinn ergibt. Nach mehreren Versuchen probiere ich einfach alles aus. Ist übrigens auch auskommentiert. :)

Wie muss ich denn vorgehen, um die Daten, die ich aus dem Dokument lade, wieder in eine XML Datei zu schreiben?
 

Elmishelmi

Mitglied
Edit: Habe den Fehler gefunden. Hab den Wald vor lauter Bäumen nicht mehr gesehen und das Problem an der falschen Stelle gesucht. Habe in meiner Maindatei eine neue Instanz des TreeModels erstellt, anstatt das aktuelle TreeModel zu benutzen.

Danke für den Tipp, hat mich zur Lösung gebracht, die Datei wird nun genau so geschrieben wie ich es möchte!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Mit Hibernate eine XML-Datei in eine Tabellenspalte einlesen. XML & JSON 1
S Muss ich bei JAXB immer noch eine zusaetzliche List-Wrapper Klasse erstellen wenn ich mehrere Objekte serialisieren will..? XML & JSON 1
D Innerhalb einer Property auf eine andere verlinken? XML & JSON 3
P wie kriege ich eine *.dtd Datei mit in die ausführbare *.jar? XML & JSON 2
L Mit Hilfe von POI eine Tabelle ohne Rahmen in Word schreiben XML & JSON 2
M Wie kann ich eine unter SAX eingelesene XML bearbeiten? XML & JSON 4
D eine Schema für ein andere Schema XML XML & JSON 14
S Aus XML-File eine Baumstruktur erzeugen XML & JSON 5
ruutaiokwu xml nur bis auf eine bestimmte ebene parsen mit javax.xml... XML & JSON 5
F Wie bringe ich zwei xml Datein mit eine jar zum laufen? XML & JSON 4
F SAX Parser siehe nichts auf dem Konsole weder eine Fehlermeldung noch eine Ergebnis XML & JSON 6
C Xml file gegen eine DTD validieren XML & JSON 3
G Problem beim schreiben von XML in eine File XML & JSON 2
B muss standalone angegeben werden sobal eine DTD vorhanden ist? XML & JSON 6
G XSL: Element über eine Variable ermitteln XML & JSON 4
M Frage zu Erklärung im Online book "Java ist auch eine I XML & JSON 4
T Wie einen String(XML Inhalt) in eine XML Datei speichern? XML & JSON 8
P XML Dateien zusammenführen und in eine XML speichern XML & JSON 7
A Mehrere Anwender sollen auf eine XML-Datei zugreifen XML & JSON 4
L mit Java eine HTML-Datei erstellen XML & JSON 3
A xml-schema aus wsdl auslagern in eine eigene xsd-Datei XML & JSON 3
G xml einlesen und bestimmte Elemente an eine gui_Klasse überg XML & JSON 25
G Mit JAXP in eine Datei schreiben XML & JSON 2
T Newbie Frage.aus Java eine XML Datei erstellen? XML & JSON 7
G Prüfen ob eine XML-Datei "well-formed" ist XML & JSON 2
G Xml Elemente in eine Liste abspeichern! XML & JSON 2
D Suche eine OnlineQuelle für SAX XML & JSON 2
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
MiMa Buch Metadaten aus XML Datei parsen XML & JSON 48
J Auslesen der Länge einer XML-Datei in Android Studio XML & JSON 8
R xlsx-Datei mit Apache POI einlesen XML & JSON 18
S Validierung einer XML-Datei - Führende Leerzeichen und Tabs XML & JSON 10
S CSV Datei einlesen und XML Ausgeben XML & JSON 2
U jar Datei mit ant erstellen XML & JSON 1
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
D Int-Werte in XML-Datei schreiben (DOM) XML & JSON 2
B xsd-Datei ins jar file XML & JSON 5
T Formulardaten in XML Datei speichern XML & JSON 5
H Wsdl datei XML & JSON 2
D Große XML-Datei in einzel Dateien splitten XML & JSON 3
S Neue Inhalte in XML-Datei einfügen XML & JSON 0
S JDOM XML Datei darstellen Fehler! XML & JSON 2
S Xml File für den Aufbau einer anderen Xml Datei XML & JSON 6
M XML-Datei mit JAXB und 2 Namespaces XML & JSON 0
J XML - Datei wird nicht ganz angezeigt XML & JSON 2
P (Eclipse)Ant Script, .jar Datei erstellen mit MANIFEST.MF XML & JSON 12
Z XML Datei mit JDOM einlesen und verarbeiten XML & JSON 6
K Beim Parsen einer XML-Datei Connection timed out XML & JSON 4
E ResultSet als XML Datei speichern XML & JSON 7
M XStream, CSV Datei XML & JSON 9
A Frage zu bestehender XML Datei XML & JSON 6
A Simple Constructor Injection Datei-Pfad XML & JSON 6
K Einlesen eines Parameters aus HTML-Datei XML & JSON 4
Maxim6394 Lesen/Schreiben von XML Datei XML & JSON 9
A XML datei lesbar speichern (eingerückt) XML & JSON 7
M XML Datei Parsen XML & JSON 4
Airwolf89 HTML Datei mit SAXBuilder laden hängt sich auf XML & JSON 4
N Java Code aus XML Datei generieren XML & JSON 8
D Aus lesen einer XML-Datei ( 1 root, 3 childs) XML & JSON 7
D Wie XML Datei einlesen und HTML entities übernehmen? XML & JSON 3
R XLM Datei lesen Ändern (kompliziertes Search and Replace) und Speichern XML & JSON 12
K Kurze XML Datei Parsen XML & JSON 5
S XSD-Datei zulässige Werte auslesen XML & JSON 3
M XML Datei heapspace erreicht XML & JSON 3
M Große Datei auslesen/in dieser suchen XML & JSON 2
S Konforme XML Datei über XSD erstellen XML & JSON 2
M RSS-Datei auslesen von Yahoo Webservice XML & JSON 4
T Inhalt einer .xml Datei auf Javaoberfläche wiedergeben XML & JSON 4
M XML Datei drucken XML & JSON 8
T Daten aus Programm in XML Datei speichern XML & JSON 2
D XSD Datei erstellen XML & JSON 4
L [SAX] Geschachtelte XML Datei parsen XML & JSON 3
E XML Datei mit DOM auslesen (Text mit Attributen) XML & JSON 2
G txt. Datei in xml datei konvertieren XML & JSON 21
K XML Datei in ein Java package „einbinden" XML & JSON 3
L Reihenfolge beim xml Datei parsen einhalten? XML & JSON 8
L xml Datei parsen ohne End-Tag XML & JSON 6
C if-Abfrage mit Datei Variable aus XML-Datei XML & JSON 2
sylo Beim Erzeugen einer XML Datei auch die XML Struktur erzeugen? XML & JSON 11
sylo DOM Document in XML Datei schreiben XML & JSON 5
F XML Datei in Java einlesen XML & JSON 4
J Objektstruktur aus XML-Datei erzeugen XML & JSON 21
D ID's aus XML Datei rauslesen und in Java ausgeben XML & JSON 7
E XML Datei einlesen und Elemente in der Console ausgeben XML & JSON 6
N value Wert einer XML Datei mit JAVA bearbeiten XML & JSON 21
ARadauer Aus XML Datei Objekte erstellen... XML & JSON 3
N MalformedByteSequenceException bei Lesen aus XML Datei XML & JSON 2
H xml-Datei mit Attributen einlesen XML & JSON 3
A XML-Datei: Ab wann kritische Größe erreicht? XML & JSON 4
multiholle XML Datei elegant verarbeiten XML & JSON 14
M XMI-Datei auslesen XML & JSON 4
T Ließt keine XML Datei XML & JSON 2

Ähnliche Java Themen

Neue Themen


Oben