tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
12211
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Hier mal ein kleines Beispiel, wie ihr eine XML Datei auslesen und als Baumstruktur darstellen könnt. (Die Datei test.xml muss im selben Verzeichnis wie die Klasse liegen):

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    
    import java.awt.BorderLayout;
    import java.io.IOException;
    import java.util.Arrays;
     
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTree;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
     
    import org.w3c.dom.Document;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    import org.xml.sax.SAXException;
     
    public class JXMLTreeTest extends JFrame {
     
        private JTree tree;
        private JScrollPane scrollPane;
     
        public JXMLTreeTest() {
            super("JXMLTreeTest");
            setDefaultCloseOperation(EXIT_ON_CLOSE);
     
            DefaultMutableTreeNode root = initTreeRoot("test.xml");
            tree = new JTree(root);
            scrollPane = new JScrollPane(tree);
            getContentPane().add(scrollPane, BorderLayout.CENTER);
     
            pack();
            setVisible(true);
        }
     
        private DefaultMutableTreeNode initTreeRoot(String file) {
            Document doc = null;
            try {
                DocumentBuilderFactory factory =
                    DocumentBuilderFactory.newInstance();
                DocumentBuilder builder = factory.newDocumentBuilder();
                doc = builder.parse(this.getClass().getResourceAsStream(file));
            } catch (ParserConfigurationException e) {
                e.printStackTrace();
            } catch (SAXException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (doc == null)
                return new DefaultMutableTreeNode("EMPTY");
     
            Node rootNode = doc.getFirstChild();
            DefaultMutableTreeNode root =
                new DefaultMutableTreeNode(rootNode.getNodeName());
            treeWalk(rootNode, 0, root);
     
            return root;
        }
     
        public static void treeWalk(
            Node node,
            int level,
            DefaultMutableTreeNode parentNode) {
     
            String nodeName = node.getNodeName();
            DefaultMutableTreeNode childNode = null;
     
            if (node.hasChildNodes()) {
                level++;
                System.out.println(repeat(level, ' ').append(nodeName));
                NodeList list = node.getChildNodes();
                int len = list.getLength();
                for (int i = 0; i < len; i++) {
                    Node child = list.item(i);
                    childNode = new DefaultMutableTreeNode(child.getNodeName());
                    parentNode.add(childNode);
                    treeWalk(list.item(i), level, childNode);
                }
            } else {
                childNode = new DefaultMutableTreeNode(node.getNodeValue());
                System.out.println(
                    repeat(level, ' ').append(node.getTextContent()));
                parentNode.add(childNode);
            }
        }
     
        public static void main(String[] args) {
            new JXMLTreeTest();
        }
     
        public final static StringBuffer repeat(int n, char c) {
            char[] cA = new char[n];
            Arrays.fill(cA, c);
            return (StringBuffer) new StringBuffer().insert(0, cA);
        }
    }

    test.xml:
    Code :
    1
    2
    
    <?xml version="1.0"?>
    <root><!--comment abc def ghi--><a><b>ABC0</b></a><a><b>ABC1</b></a><a><b>ABC2</b></a><a><b>ABC3</b><c>ABBDG</c></a></root>

    HTH Gruß Tom
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken XML Baum in JTree Abbilden-tree.jpg  
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  2. #2
    nove nove ist offline Mitglied Bronze
    Registriert seit
    May 2004
    Ort
    Mengen
    Beiträge
    46
    in der Miniaturansicht... woher kommen die #Text im Baum?
     

  3. #3
    Registriert seit
    Feb 2004
    Beiträge
    592
    Der Inhalt innerhalb des Wurzelelements kann aus verschiedenen Nodes bestehen. Es koennen weitere Elemente, PI oder eben Texte sein. Der XML Baum baut dafuer einen Knoten des Typs Text auf und speichert darin als Kind den Text extra... (Deshalb der #text Knoten und dann nochmal extra ein Knoten fuer den eigentlichen Text)

    Hmm... selbst ein wenig verwirrend mein Text... wird aber einfacher wenn man sich das DOM anschaut.

    Gruss,
    -- Romsl
     

  4. #4
    dan-ger dan-ger ist offline Grünschnabel
    Registriert seit
    Feb 2007
    Beiträge
    3
    Und wie lösche ich solche "#text Knoten"!?

    Bzw. lass ich mir meine XML Datei in einem JTree ausgeben, hab nur leider neben meinen richtigen Knoten auch Knoten die "#text" heißen. Diese Knoten möchte ich aber nicht!!

    Bitte helft mir!!


    Gruß Daniel
     

  5. #5
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  6. #6
    dan-ger dan-ger ist offline Grünschnabel
    Registriert seit
    Feb 2007
    Beiträge
    3
    Hallo,

    ich probiere seid letzter Nacht folgendes:

    Ich habe mir aus meiner XML Datei -->

    (Auszug ...)
    <?xml version="1.0"?>
    <Geometrie>
    <Wuerfel>
    <Wuerfel_1 Description="Groesse: 5x5cm - Farbe: Rot"></Wuerfel_1>
    <Wuerfel_2 Description="Groesse: 7x7cm - Farbe: Blau"></Wuerfel_2>
    </Wuerfel>
    </Geometrie>


    einen JTree anzeigen lassen. So weit so gut. Ich lasse mir den Baum auch nur bis Wuerfel_01. bzw Wuerfel_02 ausgeben. Die Ausgabe des Baumes sieht also wie folgt aus:

    Geometrie (Ordner)
    + Wuerfel (Ordner)
    - Wuerfel_01 (Blatt)
    - Wuerfel_02 (Blatt)

    Was ich jetzt gern haben möchte, ist das wenn der User in dem Baum auf Wuerfel_01 klickt, also auf das Blatt, mir die Description dieses Tags (also das Attribut) auf einem JLabel oder der gleichen ausgegeben wird.
    Kan mir jemand in diesem Fall weiter helfen!? Ich bekomme das einfach hin.

    Die Theorie verstehe ich soweit, nur ich bekomm es nicht umgesetzt *argh*.


    Gruß
    Geändert von dan-ger (11.03.07 um 16:09 Uhr)
     

  7. #7
    daily75 daily75 ist offline Grünschnabel
    Registriert seit
    Apr 2007
    Beiträge
    4
    Hallo,

    Ich habe hierzu auch eine Frage und zwar wenn ich jetzt im #comment teil der XML-Datei ein Element auskommentiert hätte.
    Also sowas " <!-- <element> test </element> --> "kann ich dann dieses Element trozdem als Element und nicht als comment im Baum anzeigen lassen?
    Wenn ja wie geht das ?

    Gruß
    daily
     

  8. #8
    PollerJava PollerJava ist offline Grünschnabel
    Registriert seit
    Jan 2008
    Beiträge
    1
    Hallo,

    Ich habe mir das Programm http://www.tutorials.de/forum/java/2...arstellen.html von oben angesehen und es funktioniert super,
    Meine Frage wäre, ob das auch in die andere Richtung funktioniert, also eine XML- Datei einlesen und in einem JTree darstellen, dann verändern und danach diesen JTree wieder in eine andere XML- Datei rausspeichern.

    Ist das irgendwie leicht möglich oder muss man sich das selber ausprogrammieren?

    Vielen Dank für die Antworten,

    lg
    Geändert von PollerJava (09.01.08 um 11:24 Uhr)
     

Ähnliche Themen

  1. Hohler Baum, B+Baum, Hash verfahren
    Von sunnysunny81 im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 12.01.10, 16:28
  2. Datenbank in XML abbilden
    Von lernen.2007 im Forum Java
    Antworten: 3
    Letzter Beitrag: 07.12.07, 00:43
  3. Tabellenbeziehungen abbilden
    Von nitt im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 14.05.07, 16:37
  4. Datenbankstruktur abbilden
    Von penntuete im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 06.04.05, 23:38
  5. Ordnerstruktur in XML abbilden?
    Von TigerFox im Forum PHP
    Antworten: 0
    Letzter Beitrag: 06.09.04, 19:08