XML - in "Stuktur" einlesen

Alphagen

Mitglied
Hallo liebe Community.

Vorab möchte ich erwähnen, dass ich von VB auf Java umgestiegen bin.
Nun zu meinem Problem:

Ich lesen eine XML-Datei aus, die wie folgt aufgebaut ist:
[XML]
<Haus>
<Stockwerk>
<Raum>
<Sitzplatz>E23</Sitzplatz>
<Sitzplatz>E24</Sitzplatz>
<Sitzplatz>E25</Sitzplatz>
</Raum>
<Raum>
<Sitzplatz>E22</Sitzplatz>
<Sitzplatz>E21</Sitzplatz>
</Raum>
</Stockwerk>
<Stockwerk>
<Raum>
<Sitzplatz>A10</Sitzplatz>
<Sitzplatz>A11</Sitzplatz>
</Raum>
<Raum>
<Sitzplatz>A13</Sitzplatz>
</Raum>
</Stockwerk>
</Haus>
[/XML]

Wozu diese XML dient denke ich ist klar. :)

Einlesen mit Java funktioniert auch wunderbar...
Jetzt möchte ich aber eben diese Daten nicht nur ausgeben sondern auch speichern. In VB ging das schön mit einer eigenen Struktur. In Java gibt es so was ja nicht.

ABER hier gibt es zum einen Arraylisten und zum anderen Klassen, Objekte, Attribute und vererbung...

Ich habe versucht Arraylisten zu verschachtel. Das sah folgendermaßen aus:

Java:
public class CLSreadHaus {

    private ArrayList<String> Sitz = new ArrayList<String>();
    private ArrayList<ArrayList> Raum = new ArrayList<ArrayList>();
    private ArrayList<ArrayList> Stock = new ArrayList<ArrayList>();
    private ArrayList<ArrayList> Haus = new ArrayList<ArrayList>();
    
    public void lesehaus_XML (String Ausgabedatei) throws ParserConfigurationException, SAXException, IOException {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse(new File(Ausgabedatei));
        NodeList ndlist = document.getChildNodes();
        for (int j = 0;j<ndlist.getLength();j++) {
            rekursive_XML(ndlist.item(j));
        }
    }
    
    private void rekursive_XML (Node nd) {
        if (nd.getNodeName().equals("Stockwerk")) {
        Haus.add (Stock);
        }
        if (nd.getNodeName().equals("Raum")) {
        Stock.add (Raum);
        }
        if (nd.hasChildNodes()){
            NodeList ndl = nd.getChildNodes();
            for (int p = 0;p<ndl.getLength();p++){
                rekursive_XML(ndl.item(p));
                String str = ndl.item(p).getNodeValue();
                if (str!=null && str.trim().length()>0 && !"\n".equals(str.trim()) && !"#text".equals(str.trim())) {
                        Raum.add(Sitz);
                        Sitz.add(ndl.item(p).getParentNode().getNodeName());
                        Sitz.add(ndl.item(p).getNodeValue());                    
                }
                
            }
        }
    }
}

Problem: Es wurde immer in jede Arraylist geschrieben. Bedeutet, ausgehend von der oben stehenden XML, die "Struktur" war folgendermaßen aufgebaut:

Code:
Haus
 + Stock
   + Raum
     + Sitzplatz (8)
   + Raum
     + Sitzplatz (8)
   + Raum
     + Sitzplatz (8)
   + Raum
     + Sitzplatz (8)
+ Stock
   + Raum
     + Sitzplatz (8)
   + Raum
     + Sitzplatz (8)
   + Raum
     + Sitzplatz (8)
   + Raum
     + Sitzplatz (8)

Sie müsste aber wie folgt aussehen:

Code:
Haus
 + Stock
   + Raum
     + Sitzplatz (3)
   + Raum
     + Sitzplatz (2)
+ Stock
   + Raum
     + Sitzplatz (2)
   + Raum
     + Sitzplatz (1)

Wer kann mir helfen? Was mache ich falsch?! ^^

Ich bin auch gerne für andere Lösungsideen oder -ansätze dankbar.

Wie ich das mit Klassen lösen soll weiß ich leider auch nicht...

Ich bedanke mich schonmal im Voraus und wenns auch nur dafür ist, dass sich jemand die Zeit genommen hat um das zu lesen und den Versuch zu starten mir zu helfen. :)

LG Alphagen
 

Michael...

Top Contributor
Ich würde da eher eigene Klassen für Haus, Stockwerk... schreiben.

Zum Problem: Die verwendest jeweils nur eine Liste zum speichern der unterschiedlichen Elemente, müsstest aber für jedes "Haus" eine neue Stockwerk Liste, für jedes Stockwerk eine neue Raumliste usw. erzeugen.

Müsste aber in VB das gleiche sein.
 

Alphagen

Mitglied
In VB habe ich mir immer einfach eine eigene Datenstruktur gebaut, die genau wie die XML aussah und die Daten reingeschrieben...

Code:
Private Type Sitz
   Name as String
End Type

Private Type Raum
   Sitz() as Sitz
End Type

Private Type Stock
   Raum() as Raum
End Type

Private Type Haus
   Stock() as Stock
End Type

Private Haus as Haus

Aber zurück zum Problem (ich glaube es ist mehr ein Verständnissproblem von mir)

Wenn ich dich richtig verstehe, dann müsste das ganze folgendermaßen aussehen (ist nur Beispielcode...)

Java:
private ArrayList<String> Sitz1 = new ArrayList<String>();
private ArrayList<String> Sitz2 = new ArrayList<String>();
private ArrayList<String> Sitz3 = new ArrayList<String>();
private ArrayList<String> Sitz4 = new ArrayList<String>();
.
.
.
private ArrayList<ArrayList> Raum1 = new ArrayList<ArrayList>();
private ArrayList<ArrayList> Raum2 = new ArrayList<ArrayList>();
private ArrayList<ArrayList> Raum3 = new ArrayList<ArrayList>();
private ArrayList<ArrayList> Raum4 = new ArrayList<ArrayList>();
private ArrayList<ArrayList> Stock1 = new ArrayList<ArrayList>();
private ArrayList<ArrayList> Stock2 = new ArrayList<ArrayList>();
private ArrayList<ArrayList> Haus = new ArrayList<ArrayList>();

Ich blick nicht mehr durch. *lacht*

Wie würdest du das denn mit Klassen lösen?

Das hab ich auch schon versucht... Aber nut mit mäßigem Erfolg, da ich wie gesagt erst vor kurzem von VB6 umgestiegen bin und mein Verständniss dafür noch ziemlich gering ist...

Ich habe versucht eine Klasse "Haus" zu schreiben, die ein Objekt der Klasse "Stock" erzeugt. Ist der Ansatz richtig? (Es hat übrigens nicht funktioniert. Aber wenn ich weiß, dass der Ansatz richtig ist, klemm ich mich dahinter! ^^). Will das ganze ja auch selber schreiben, damit ich durchblicke wie es funktioniert! ^^

Vielen dank für deine Antwort. :)
 

Michael...

Top Contributor
eher so:
Java:
public class CLSreadHaus {
 
    private ArrayList<ArrayList> haus = new ArrayList<ArrayList>();
    private ArrayList<ArrayList> stock;
    private ArrayList<ArrayList> raum;
    
    ...
    
    private void rekursive_XML (Node nd) {
        if (nd.getNodeName().equals("Stockwerk")) {
             stock = new ArrayList<ArrayList>();
             haus.add (stock);
        }
        if (nd.getNodeName().equals("Raum")) {
             raum = new ArrayList<ArrayList>();
             stock.add (raum);
        }
        ...

Die Datenstruktur kannst Du in Java genauso nachbauen:
Java:
class Haus {
	private List<Stockwerk> stockwerkListe = new ArrayList<Stockwerk>();
	
	public void addStockwerk(Stockwerk stockwerk) {
		this.stockwerkListe.add(stockwerk);
	}
	
	public Stockwerk getStockwerk(int index) {
		return this.stockwerkListe.get(index);
	}
}
 

Alphagen

Mitglied
Das da wird jetzt sofort ausprobiert... Und wenns funktioniert, dann versuch ich es mit den Klassen... Will jetzt wissen wie das funktioniert! ^^

Danke schonmal. Gebe gleich nochmal Rückmeldung.
 

Alphagen

Mitglied
:eek:
Der Vorgang mit der Arrayliste wurde getestet und für korrekt befunden!! :) Vielen Vielen Dank...

Die Lösung lag auf der Hand...

ICH: Am Anfang werden die Listen erzeugt und dann nur noch rein geschrieben.

DU: Jedesmal wenn der Nodename auftritt, erzeugst du eine neue Liste.

Wie sagte einst eine weise Frau? (Es war meine Mutter. *lacht*)

Hinterher ist jeder Affe ein Professor!

Nochmal vielen Dank.

Das mit den Klassen probier ich am WE aus... Das muss ja auch irgendwie zu schaffen sein.. Gebe dir dann Rückmeldung. :)
 

Landei

Top Contributor
Lege eigene Objekte für Haus, Stockwerk, Raum an. Ein Haus hat eine Liste Stockwerke u.s.w.

Dann nimmst du eine Bibliothek wie JAXB, annotierst deine Objekte ein wenig (damit ist klar ist, welches XML-Element auf welche Datenstruktur abgebildet wird) und das Einlesen wird automatisch durchgeführt. Hier ein ganz einfaches Tutorial: JAXB Tutorial

Alternativen wären DOM oder SAX, die aber weniger bequem sind.

"Händisches" Einlesen wie du es machst ist fehleranfällig und kann nicht alle Einzelheiten des recht komplexen XML-Standards abdecken (Name-spaces, Enities, CDATA-Sections...).
 
Zuletzt bearbeitet:

Alphagen

Mitglied
Ui... Direkt das nächste was ich mir dann auch angucke! xD

Ich werde ja gefüttert mit Infos! Auch dir vielen Dank.

Das händische einlesen ist auch nur möglich, weil ich die XML-Datei selber generiere und somit QUASI einen internen "Standard" geschaffen habe. ;-)

Aber du hast Recht. Meine Methode ist sehr anfällig für Fehler, was auch an der laaaaaangen Code zum einlesen liegt. Je mehr man schreibt, desto mehr vertippt man sich oder kann man falsch schreiben.

Wie gesagt, ich bin euch wirklich ausgesprochen Dankbar für eure Hilfe und werde mir sowohl das mit den Klassen ansehen als auch JAXB. Was mir das Projekt aber auf jeden Fall gezeigt hat ist, dass ein Umstieg in Programmiersprachen garnicht sooo einfach ist wie immer alle sagen UND dass ich mich noch viel zu wenig mit Java beschäftigt habe.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Variable Zimmergrößen per scanner einlesen Java Basics - Anfänger-Themen 5
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
G JTree speichern und wieder einlesen Java Basics - Anfänger-Themen 5
T Text einlesen code was kommt dahin? Java Basics - Anfänger-Themen 1
S SeriellenPort einlesen Java Basics - Anfänger-Themen 3
I XML einlesen und Objekte bekommen Java Basics - Anfänger-Themen 2
M Daten aus .txt Datei einlesen und weiterverarbeiten Java Basics - Anfänger-Themen 80
julian0507 Wörter einlesen lassen und rückwärts ausgeben Java Basics - Anfänger-Themen 7
S JSON einlesen und benutzen Java Basics - Anfänger-Themen 5
A CSv.Datei einlesen und die werte in zweidemosional Int Array speichern Java Basics - Anfänger-Themen 9
I Ical4j / Kalender einlesen von URL - Fehler: "Unparseable date" Java Basics - Anfänger-Themen 16
Saiko Zeilen einer Datei einlesen Java Basics - Anfänger-Themen 3
sserio Txt Datei einlesen Java Basics - Anfänger-Themen 9
D Strings aus Excel-Datei einlesen Java Basics - Anfänger-Themen 2
julian112 Input/Output .gz bzw. .txt Datei Einlesen und Umgang mit Exceptions Java Basics - Anfänger-Themen 1
M String beim einlesen formatieren Java Basics - Anfänger-Themen 12
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
G JSP Textfeld einlesen Java Basics - Anfänger-Themen 2
M Einlesen > new Leser Java Basics - Anfänger-Themen 5
W Werte durch Konsole einlesen Java Basics - Anfänger-Themen 10
A Array einlesen und ausgeben Java Basics - Anfänger-Themen 13
K Datum einlesen und Tag, Monat und Jahr einzeln ausgeben Java Basics - Anfänger-Themen 1
K Datum einlesen und Tag, Monat und Jahr einzeln ausgeben Java Basics - Anfänger-Themen 1
KogoroMori21 Textdatei einlesen im Array (Selection Sort Algorithmus) Java Basics - Anfänger-Themen 3
S Wort einlesen Array ausgeben Java Basics - Anfänger-Themen 4
I Java String einlesen und auslesen Java Basics - Anfänger-Themen 11
A Input/Output Mehrere Csv-Dateien einlesen Java Basics - Anfänger-Themen 2
S CSV einlesen und mit Komma trennen Java Basics - Anfänger-Themen 12
CptK Richtigen Pfad beim einlesen von Datei finden Java Basics - Anfänger-Themen 2
I Java-Wort einlesen und ausgeben Java Basics - Anfänger-Themen 7
J Csv-Datei einlesen Java Basics - Anfänger-Themen 52
JD_1998 Arrays einlesen, zwischenspeichern und wieder ausgeben Java Basics - Anfänger-Themen 8
L Konstruktor für eine Map-Datei/Map-Datei einlesen Java Basics - Anfänger-Themen 5
L Datein einlesen Java Basics - Anfänger-Themen 1
O zufälliges Wort aus einer Datei einlesen Java Basics - Anfänger-Themen 32
E Input/Output Datei anhand von Dateinamen einlesen Java Basics - Anfänger-Themen 5
C Datei über relative Pfade einlesen Java Basics - Anfänger-Themen 6
A Input/Output Dateien einlesen und ausgeben Java Basics - Anfänger-Themen 7
A Klasse um daten zu einlesen Java Basics - Anfänger-Themen 26
A 2d Arrays aus txt.file einlesen Java Basics - Anfänger-Themen 16
A Textdatei mit stream einlesen Java Basics - Anfänger-Themen 2
P Datei einlesen und zurückgeben Java Basics - Anfänger-Themen 5
G String wird nach Einlesen aus Datei nicht erkannt Java Basics - Anfänger-Themen 3
M String in Scanner einlesen Java Basics - Anfänger-Themen 6
E TXT FILE EINLESEN Java Basics - Anfänger-Themen 4
M Einzelzeichen einlesen Java Basics - Anfänger-Themen 2
C (char) Array einlesen Java Basics - Anfänger-Themen 8
B HTML File einlesen inkl. Bilder? Java Basics - Anfänger-Themen 2
E Mehrere Eingabezeilen gleichzeitig einlesen Java Basics - Anfänger-Themen 7
B HTML Datei einlesen und HTML Code in String wandeln Java Basics - Anfänger-Themen 19
V Schleife für das Einlesen von Werten für int Variablen, die Bestandteil von Arrays sein sollen Java Basics - Anfänger-Themen 16
I Nur auf Abfrage von einer Text Datei einlesen Java Basics - Anfänger-Themen 11
P Text Datei einlesen und übertragen Java Basics - Anfänger-Themen 15
E Einteilung der Räume mit einlesen einer .txt datei Java Basics - Anfänger-Themen 16
P Array einlesen von Konsole Java Basics - Anfänger-Themen 8
D Eingaben in String Array einlesen Java Basics - Anfänger-Themen 12
B CSV einlesen - Parameter a) encoding b) delimiter Java Basics - Anfänger-Themen 7
R Compiler-Fehler Einlesen von Konsolenparameter funtioniert nichtmehr Java Basics - Anfänger-Themen 4
I OOP Objektnamen über die Konsole richtig einlesen Java Basics - Anfänger-Themen 9
J Einlesen von Datei funktioniert nicht Java Basics - Anfänger-Themen 8
H Einlesen Java Basics - Anfänger-Themen 8
H Einlesen von Zahlen Java Basics - Anfänger-Themen 20
B mehrere Werte mit scanner und while schleife einlesen, max berechnen bzw addieren Java Basics - Anfänger-Themen 2
CptK Datentypen Text Dateien einlesen Java Basics - Anfänger-Themen 3
A Datentypen Unterschiedliche Datentypen in einer Eingabe einlesen Java Basics - Anfänger-Themen 2
R txt Einlesen und Verarbeiten Java Basics - Anfänger-Themen 15
M Erste Schritte CSV-File einlesen und Daten verarbeiten Java Basics - Anfänger-Themen 5
M Datei einlesen mit Scanner funktioniert nicht (FileNotFoundException) Java Basics - Anfänger-Themen 6
K Sonderzeichen einlesen Java Basics - Anfänger-Themen 3
L Input/Output XML Datei einlesen (JAXB?) Java Basics - Anfänger-Themen 10
F Zahlen aus Datei einlesen und in Array speichern Java Basics - Anfänger-Themen 2
I Datei einlesen Java Basics - Anfänger-Themen 11
J Best Practice [Code Verbesserung] TXT einlesen und in Arrayliste speichern Java Basics - Anfänger-Themen 5
A Ungeordnetes Array ordnen, Zahl einlesen und einordnen Java Basics - Anfänger-Themen 23
R Erste Schritte Sicheres einlesen eines Strings Java Basics - Anfänger-Themen 2
MaximilianTM Input/Output Einlesen und bearbeiten einer text Datei / Zeile Java Basics - Anfänger-Themen 5
C Erste Schritte Regex - Datei einlesen und splitten Java Basics - Anfänger-Themen 4
T Input/Output Einlesen eines .txt Files nur bei gesetztem Breakpoint möglich Java Basics - Anfänger-Themen 1
L RSA Public Key einlesen Java Basics - Anfänger-Themen 0
K Datei aus unbekannten Speicherorten einlesen Java Basics - Anfänger-Themen 1
T Datei in Array einlesen "null" Java Basics - Anfänger-Themen 8
U Daten aus Datei einlesen Java Basics - Anfänger-Themen 4
J Auslesen/speichern und wieder einlesen Java Basics - Anfänger-Themen 7
N Datei Zeilenweise einlesen, Ausgabe mehrere Arrays Java Basics - Anfänger-Themen 7
B Excel File einlesen und Überschrift prüfen Java Basics - Anfänger-Themen 8
M Einlesen von Integerwertern aus einer CSV Java Basics - Anfänger-Themen 8
? Methoden Boolean Wert vergleichen und einlesen Java Basics - Anfänger-Themen 1
K String einlesen und als Variable speichern Java Basics - Anfänger-Themen 8
K .txt einlesen und in ein Array packen Java Basics - Anfänger-Themen 2
M Erste Schritte Zahlen einlesen und auswerten Java Basics - Anfänger-Themen 6
N Best Practice CSV einlesen - Variables Array?! Java Basics - Anfänger-Themen 8
O Klassen Objektnamen für Methodenaufrauf einlesen lassen Java Basics - Anfänger-Themen 2
D Array Werte einlesen und ausgeben? Java Basics - Anfänger-Themen 8
C Java Scanner einlesen von txt Dokument InputMismatch Java Basics - Anfänger-Themen 9
V Hilfe zum Thema einlesen eines Datums Java Basics - Anfänger-Themen 5
E Erste Schritte txt.Datei mit BufferedReader einlesen und in 2D-Array abspeichern Java Basics - Anfänger-Themen 15
S Werte in Array einlesen Java Basics - Anfänger-Themen 2
A Textdatei mit BufferedReader einlesen Java Basics - Anfänger-Themen 0
P Einlesen von Daten via BufferedReader Java Basics - Anfänger-Themen 4
J Zahlen aus Konsole einlesen Java Basics - Anfänger-Themen 1

Ähnliche Java Themen


Oben