tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
1
ZUGRIFFE
1089
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Happyman Happyman ist offline Grünschnabel
    Registriert seit
    Feb 2004
    Beiträge
    2
    Hi Leute!
    Sitze grad an einem Problem fest und hab zu wenig Programmiererfahrung, um da weiterzukommen (glaube ich) - oder ich komm einfach nicht drauf.
    Also, Aufgabe ist es, eine XML-Datei einzulesen und deren Struktur in eine Baumstruktur zu überführen. Und das OHNE vorgefertigte Parser wie den DOM-Parser etc. (seufz)
    Ich will das mit DefaultMutableTreeNodes lösen und dann in nem JTree ausgeben lassen.
    Die kleine, feine Test-XML-Datei, die eingelesen werden soll, sieht so aus:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    <buecherei>
        <buch>
            <autor>Dominik57</autor>
            <titel>Versautes aus meinem Leben</titel>
            <seiten>285</seiten>
            <isbn>2375492928</isbn>
        </buch>
    </buecherei>

    Und hier meine kleine Parser-Klasse - bestimmt nichts hochprofessionelles und absolut effizientes, aber es soll ja auch nur funktionieren

    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
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    
    package xmlParser;
     
     
    import java.io.*;
    import java.util.regex.*;
     
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTree;
    import java.awt.Dimension;
     
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.TreeSelectionModel;
    import javax.swing.event.TreeSelectionEvent;
    import javax.swing.event.TreeSelectionListener;
     
    public class XMLparse {
        
        static String datei = new JFileCHooserDemo().auswahlfenster();
        static String dokument ="";
        static String linie;
        //Create the nodes.
        static DefaultMutableTreeNode wurzel;
        static DefaultMutableTreeNode knoten;
        static DefaultMutableTreeNode blatt;
        static int zaehler = 0;
     
        
        public static void main(String argv[])
          {
            if (datei == null) {
              System.err.println(
                  "Keine Datei gewählt!");
              System.exit(1);
            }
            else {
                parse();
                ausgabe();
            }
          }
        public static void parse() {
            
            try {
                FileReader dateileser = new FileReader(datei);
                BufferedReader bufferleser = new BufferedReader(dateileser);
                while((linie = bufferleser.readLine()) != null)
                {
                    dokument += linie;
                }
                // dokument = dokument.replaceAll(" ", "");
                dokument = dokument.replaceAll("    ", ""); 
                
                // System.out.println(dokument);
                dateileser.close();
                bufferleser.close();
                
                
     
                zerteilen(dokument);
     
            } catch (IOException e) {
                e.printStackTrace();
            }
            
        }
        
        
        public static void zerteilen(String str)
        {
            String zwischenspeicher = str;
            Pattern p = Pattern.compile("(<)(\\w*)(>)(.*)</\\2>");
            Matcher m = p.matcher(zwischenspeicher);
            
     
     
            while (m.find())
            {
                
                zaehler += 1;
                if (zaehler == 1)
                {
                    wurzel = new DefaultMutableTreeNode(m.group(2));
                }
                else 
                {
                    knoten = new DefaultMutableTreeNode(m.group(2));
                    wurzel.add(knoten);
                }
                    
                Matcher pruefmatcher = p.matcher(m.group(4));
                if (pruefmatcher.find() == false)
                {
                    blatt = new DefaultMutableTreeNode(m.group(4));
                    knoten.add(blatt);
                }
     
                zwischenspeicher = m.group(4);
                zerteilen(zwischenspeicher);
                
                
            }
            
        }
     
        public static void ausgabe(){
            JTree tree = new JTree( wurzel );
            
            JFrame frame = new JFrame( "XML-Baum" );
            frame.add( new JScrollPane( tree ));
            frame.setMinimumSize(new Dimension(200,400));
            frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
            //frame.pack();
            frame.setLocationRelativeTo( null );
            frame.setVisible( true );
     
        }
     
     
    }

    Mein Denkknoten liegt in der rekursiven Methode zerteilen(). Denn zur Zeit sieht die Ausgabe des Baumes so aus:

    http://img200.imageshack.us/img200/9867/xml.png

    Da müssen aber eigentlich "Autor", "Titel", "Seiten" und "ISBN" Kinder von "Buch" sein

    Wie schaff ich dass, dass der mir den Baum wie gewünscht "mehr verschachtelt"
    Vielen Dank im Voraus für eure Antworten :-*

    Happyman
     

  2. #2
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    XML so selber parsen ist aber sehr kompliziert. Eine einfache API wie XStream machts einfacher. In deinem Fall würde wahrscheinlich ein Stax-Parser auch recht gut funktionieren.

    Wenn ein neues Element anfängt erstellt du dir ein TreeNode und merkst dir diesen in einer Variablen. Jedes Unterelement fügst du dann dem aktuellen hinzu und machst es selber zum aktuellen. Sobald ein Element endet rufst du auf dem aktuellen Knoten getParent auf und packst diesen in die Variable.

    So solltest du nen Tree erhalten.
     

Ähnliche Themen

  1. XML-Datei in JTree einlesen mittels JDOM
    Von raffi im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 30.06.10, 20:35
  2. JTree dynamisch erzeugen aus DB-Array
    Von stefschi im Forum Algorithmen & Datenstrukturen mit Java
    Antworten: 1
    Letzter Beitrag: 29.05.09, 12:01
  3. JTree aus Excel-Tabelle mit gruppierten Elementen erzeugen
    Von flispy im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 17.05.08, 14:09
  4. Datei rekursiv erstellen
    Von gello im Forum Java
    Antworten: 2
    Letzter Beitrag: 29.04.08, 16:33
  5. Knoten-Attribute einer xsd-Datei in einem JTree auslesen
    Von Perplex im Forum XML Technologien
    Antworten: 0
    Letzter Beitrag: 20.07.05, 18:24