# JDOM XML Datei darstellen Fehler!



## sundance (17. Mrz 2014)

Guten Tag Leute,

ich habe die Aufgabe eine XML- Datei in Baumstruktur visuell darzustellen. Ich habe mir überlegt es in Java mit JDOM mit JTree zu machen. Jedoch fällt mir das etwas schwer, da ich längere Zeit nicht programmiert habe.

Ich habe folgendes Tutorial benutzt: How to display XML in a JTree using JDOM (Java source code)

und den Code auch so übernommen. 

Führe ich ihn aus bekomme ich jedoch folgende Fehlermeldung: 

Error: unable to build tree from xml:
java.lang.Exception: 
org.jdom2.JDOMException: Unable to create SAX2 XMLReader.

Ich befürchte, dass mir eine JAR- Datei fehlt bzw. ich sie nicht eingebunden habe. Habe bereits nach der Fehlermeldung gesucht und nichts nutzbares gefunden. 

Ich hoffe mir kann jemand helfen das Problem zu lösen. Gibt es ggf. noch andere Möglichkeiten die Aufgabe zu lösen?


EDIT: Außerdem zeigt er mir im Code an, dass der SAXBuilder veraltet ist.


----------



## sundance (18. Mrz 2014)

Ich habe vergessen die JARs einzufügen, nun stellt er mir die XML auch in Baumstruktur da. 

Ich kann die einzelnen Nodes auch anklicken zum bearbeiten, jedoch übernimmt er die Eingabe nicht und setzt sie sofort zurück. Woran kann das liegen? ich füge mal den Code der Klasse ein:


```
package com.arsitech.xml;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Properties;

import javax.swing.JEditorPane;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTree;
import javax.swing.WindowConstants;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;


/**
 * Simple gui to display an xml tree.
 */
public class XMLViewer extends JFrame {
    
    private final String title = "JDOM XML Tree";
    private final MenuBar menuBar = new MenuBar();
    private final Menu fileMenu = new Menu();
    private final MenuItem open = new MenuItem();
    private final JFileChooser fileChooser = new JFileChooser();
  
    private final XMLTree xmlTree;
    private File file;
    public JTree tree;
    private Exception exception;
    
    private final int windowHeight = 600;
    private final int leftWidth = 380;
    private final int rightWidth = 600;
    private final int windowWidth = leftWidth + rightWidth;
    private final Font treeFont = new Font("Lucida Console", Font.BOLD, 14);
    private final Font textFont = new Font("Lucida Console", Font.PLAIN, 13);
    
    
    /**
     * Creates a simple gui for viewing xml in a tree.
     */
    public XMLViewer() {        
        
        setTitle(getClass().getSimpleName());
        setPreferredSize(new Dimension(windowWidth, windowHeight));
        setFocusable(true);
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);        
        
        xmlTree = new XMLTree();
        
        fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        fileChooser.setFileFilter(new XMLFileFilter());
        fileChooser.setCurrentDirectory(new File("C:/Desktop"));
        
        
        fileMenu.setLabel("File");
        open.setLabel("Browse");
        open.addActionListener(new MyActionListener());
        
        makeFrame();
        
        open.dispatchEvent(new ActionEvent(open,1001,open.getActionCommand()));
    }
    
    /**
     * Construct a frame of the most recently read-in document.
     */
    private void makeFrame() {
        
        getContentPane().removeAll();
                
        fileMenu.add(open);
        menuBar.add(fileMenu);
        setMenuBar(menuBar);
        
        pack();
        setVisible(true);
    }
    
    /**
     * Displays the tree.
     * 
     * @param tree JTree to display
     */
    public void display() {
        try {
            makeFrame();
            
            JScrollPane treeScrollPane = null;
            JScrollPane textScrollPane = null;
            
            // Build left-side view
            if(tree != null) {
                tree.setFont(treeFont); 
                tree.setEditable(true);
                treeScrollPane = new JScrollPane(tree);
                treeScrollPane.setPreferredSize(new Dimension(leftWidth, windowHeight));
            } else {
                JEditorPane errorMessagePane = new JEditorPane();
                errorMessagePane.setEditable(false);
                errorMessagePane.setContentType("text/plain");
                errorMessagePane.setText("Error: unable to build tree from xml:\n"+ exception.toString());
                errorMessagePane.setCaretPosition(0);
                treeScrollPane = new JScrollPane(errorMessagePane);
            }
            // Build right-side view
            if(file != null) {
                StringBuilder sb = new StringBuilder();
                
                //TODO show validation

                try {
                    BufferedReader reader = new BufferedReader(new FileReader(file));
                    String line = "";
                    while((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                    }
                    reader.close();
                } catch (Exception e) {
                    System.err.println("exception when reading file for display");
                    e.printStackTrace();
                } 
                
                JEditorPane textPane = new JEditorPane();
                textPane.setEditable(false);
                textPane.setContentType("text/plain");
                textPane.setText(sb.toString());
                textPane.setCaretPosition(0);
                textPane.setFont(textFont);
                textScrollPane = new JScrollPane(textPane);
                textScrollPane.setPreferredSize(new Dimension(rightWidth, windowHeight));
            }
    
            // Build split-pane view
            JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
                    treeScrollPane, textScrollPane);
            
            splitPane.setContinuousLayout(true);
            splitPane.setDividerLocation(leftWidth);
            splitPane.setPreferredSize(new Dimension(windowWidth + 10,
                    windowHeight + 10));
    
            // Add GUI components
            setLayout(new BorderLayout());
            add("Center", splitPane);
            pack();
            setVisible(true);
        } catch (Exception e) {
            System.err.println("error when updating xml viewer");
            e.printStackTrace();
        }
    }
    
    /** listener for when user selects a file to view */
    private class MyActionListener implements ActionListener {

        public void actionPerformed(ActionEvent ae) {
            if (ae.getSource() == open) {

                int returnVal = fileChooser.showOpenDialog(null);

                if (returnVal == JFileChooser.APPROVE_OPTION) {

                    //reset for currently selected message
                    exception = null;
                    
                    file = fileChooser.getSelectedFile();
                    
                    // update the gui for this file
                    setTitle(title + " | " + (file != null ? file.getAbsolutePath() : "Select A File"));
                    
                    // remember last directory used
                    fileChooser.setCurrentDirectory(file);
                    
                    try {
                        xmlTree.parseFile(file);
                    } catch (Exception e) {
                        exception = e;
                    }
                    tree = xmlTree.getTree();
                    display();
                }
            }
        }
    }
    
    public static void main(String[] argv) {
        new XMLViewer();
    }
}
```


----------



## sundance (25. Mrz 2014)

Ok das Problem hat sich auch erledigt und ein neues tritt auf.

Und zwar möchte ich den veränderten JTree wieder in eine XML Datei speichern. Beziehungsweise die Daten des JTree wieder zurück in eine XML Datei.

Jemand eine mögliche Lösung? Habe bereits mehrere Stunden gegoogled aber nichts sinnvolles gefunden


----------

