# Aus XML-File eine Baumstruktur erzeugen



## sabine01 (20. Jan 2011)

Hallo zusammen,

seit einigen Tagen versuche ich, aus einer XML-Datei eine Baumstruktur zu erzeugen. Dafür verwende ich ein Beispiel aus dem Internet.

Die auszulesende Datei hat die folgende Sturktur:
[XML]
<OBJECTTYPE id="4"> 
 <OBJECTSHEET id="A">
  <ATTRIBUTE id="500"></ATTRIBUTE>
  <ATTRIBUTE id="501"></ATTRIBUTE>
  <ATTRIBUTE id="502"></ATTRIBUTE>
  <ATTRIBUTE id="503"></ATTRIBUTE>
 </OBJECTSHEET>
 <OBJECTSHEET id="B">
 <OBJECTSHEET id="B1">
  <ATTRIBUTE id="601"></ATTRIBUTE>
  <ATTRIBUTE id="602"></ATTRIBUTE>
  <ATTRIBUTE id="603"></ATTRIBUTE>
 </OBJECTSHEET>
 <OBJECTSHEET id="B2">
  <ATTRIBUTE id="701"></ATTRIBUTE>
  <ATTRIBUTE id="702"></ATTRIBUTE>
 </OBJECTSHEET>
 </OBJECTSHEET>
 <OBJECTSHEET id="C">
  <ATTRIBUTE id="801"></ATTRIBUTE>
  <ATTRIBUTE id="802"></ATTRIBUTE>
 </OBJECTSHEET>
</OBJECTTYPE>
[/XML]

Die Datei lese ich unter Verwendung des Beispielcodes aus. Mein Problem besteht jetzt darin, auf die einzelnen Attributfelder zuzugreifen. Ich erhalte die Attribute von OBJECTTYPE, OBJECTSHEET und ATTRIBUTE jedoch immer um eine Ebene versetzt.

Bsp: 
OBJECTSHEET bekommt ID von  OBJECTTYPE (4)
ATTRIBUTE  bekommt ID von OBJECTSHEET (A,B,C)

Und auf die ID von ATTRIBUTE kann ich nicht zugreifen.

Hat möglichweise jemand von euch eine Idee? Über einen Lösungsvorschläg wäre ich sehr erfreut 


```
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();

            String name = ((Element)((Node)list)).getAttribute("id"); /* HIER LESE ICH EIN*/
            
            
            int len = list.getLength();
            for (int i = 0; i < len; i++) {
                Node child = list.item(i);               
               
                                
                                NodeList list2 = child.getChildNodes();
                childNode = new DefaultMutableTreeNode(name + ":" + 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);
        }
    }
```


----------



## reibi (20. Jan 2011)

Hi

Grundsätzlich : Dein Problem ist zu speziell.
Hab rausgefunden, das Du mit Baumstruktur einen Baum in Swing meinst. Das sind zwei ganz grobe Themen die Du sepasrat abhandeln musst. Sonst wird Dir auch keiner antworten. Dann ist noch wichtig den Titel Deines Beitrags ganz konkret zu schreiben. Dann gibts mehr Hoffnung auf Hilfe. Diese Erfahrung habe ich zumindest gemacht.

Ich würde Dein Problem erstmal teilen in.

-XML auslesen(Elemente, Attribute) in der XML-Baumstruktur
-Swing-Tree erstellen

Vielleicht findest Du ja schon bestehende Beiträge, ansonsten mach einfach n neues Thema auf.

Gruss und viel Glück ;-)


----------



## Noctarius (20. Jan 2011)

Wieso machst du dir kein XSD und lässt das XML von JAXB / EMF laden?


----------



## sabine01 (20. Jan 2011)

Hallo,

danke zunächst für eure Kommentare.

@reibi, Grundsätzlich möchte ich eigentlich nur die XML auslesen und die Struktur in einem Array abspeichern. Visualisiert in einem Strukturbaum ist später dran. Das Einlesen von Attributen habe ich bereits gemacht (direkt auf die Elemente verwiesen). Dies ist hier jedoch nicht wirklich Zielführen, da ich exakt die Struktur der XML-Datei abbilden möchte.

@Noctarius, Die XML liegt ohne XSD im Intranet. Es könnte zu jedem Zeitpunkt eine Modifikation der Struktur vorgenommen werden. Das heißt, möglichst direkt aus der XML lesen und die dazugehörige Struktur im Array abspeichern ist das Ziel.

Grüße, die Sabine


----------



## Wildcard (20. Jan 2011)

EMF generiert dir auch gleich die extrem praktischen ItemProvider. Damit kannst du die XML in SWT direkt als Baum anzeigen und für Swing musst du nur einen einfachen Wrapper schreiben der aus einem ItemProvider ein Swing TreeModel macht.


----------



## reibi (20. Jan 2011)

Hi



sabine01 hat gesagt.:


> ...Grundsätzlich möchte ich eigentlich nur die XML auslesen und die Struktur in einem Array abspeichern...



Also die Struktur ist ja mehrdimensional, und ein Array nur eindimensional. Deshalb würde das grundsätzlich ja nicht gehen.

- Willst Du eine Ebene in einem Array(oder Liste) speichern?
zB Alle ATTRIBUTe aus dem Element OBJECTSHEETmit der id="A"


oder
- alle Ebenen in einem Array speichern
Dann musst Du ein mehrdimensionales Array bauen ... also ein array in einem array usw.

Das würde ich aber nicht so lösen, da das ab der 12ten Dimension ganz schön haarig fürs Verständis käme ;-)

Noch was zur Benamselung Deines XML Files:
Also die STruktur ist ja nicht schlecht. Aber das Element mit dem Namen "ATTRIBUT" sollte anders heissen. Ein Attribut in XML ist das was bei Dir zB -->id="A" <-- heisst. Und damit es nicht zu Begriffsverwechselungen kommt, verwendet man dazu einen anderen Namen für das Tag.

Gruss


----------

