# XML - Buch mit 7 Siegeln



## chrgai (25. Mrz 2008)

Moin.
Ich habe ein Programm, das verschiedene Objekte verwaltet. Bisher habe ich die Daten in einer CSV-Datei
gespeichert, und daraus ausgelesen (CSV = Comma Separated Value, d.h. das zwischen den Werten ein Komma ist).
Pro Objekt habe ich eine Zeile in der Textdatei.
Nun möchte ich die Datenquelle auf xml umstellen. Sie soll in etwa so aussehen:

```
<?xml version="1.0" encoding="UTF-8"?>
<Datenbank>
  <Objekt>
    <Var1>1234</Var1>
    <Var2>5678</Var2>
    .......
  </Objekt>
  <Objekt>
    .........
  </Objekt>
</Datenbank>
```
Mit der CSV-Datei war das kein Problem. Die Objekte wurden über die Zeile erkannt, die Werte (Var1, Var2 usw.)
mit Komma seperiert.
Nun möchte ich das aber wie schon gesagt in xml realisieren. Die Daten sollen nach dem auslesen in einem
Vector (Vector<Object>) landen. Auch zum speichern übergebe ich derzeit nur den Vector. In allen
Tutorials werden aber die Objeke mit Ihren Tags angesprochen, was bei mir nicht geht, da es beliebig
viele Objekte sein sollen. Jedes Objekt in der XML-Datei soll auch ein Java-Objekt sein. Das zuweisen
der einzelnen Variablenwerte wird über die settermethoden der Objekte realisiert.
Ich habe schon 2 Tage lang alle möglichen Tutorials durchgelesen, aber nichts wirklich einfaches und vor
allem passendes gefunden.
Bin für jede Hilfe dankbar.

/christian


----------



## chrgai (25. Mrz 2008)

Ich habe mal einen ersten Lösungsansatz erarbeitet. Leider funzt der Code nocht nicht.

```
try {
            File file = new File("datenbank.xml");
            Vector<datensatz> dat = new Vector<datensatz>();
            DocumentBuilder builder =
                    DocumentBuilderFactory.newInstance().newDocumentBuilder();
            Document doc = builder.parse(file);
            NodeList datensaetze = doc.getElementsByTagName("Datensatz");
            for (int i = 0; i < datensaetze.getLength(); i++) {
                Datensatz a = new Datensatz();
                Element element = (Element)datensaetze.item(i);
                a.setName(element.getAttribute("Name"));
                a.setHaarfarbe(element.getAttribute("Haarfarbe"));
                dat.add(a);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
```
Die xml-datei würde dann z.B. so aussehen:

```
<?xml version="1.0" encoding="UTF-8"?> 
<Datensatz>
   <Name>Bernd</Name>
   <Haarfarbe>Braun</Haarfarbe>
</Datensatz>
<Datensatz>
   <Name>Norbert</Name>
   <Haarfarbe>Blond</Haarfarbe>
</Datensatz>
```

Leider leider funktioniert das einlesen nicht. Es wird zwar ein Objekt im Vector gespeichert,
aber es enthält keine Daten?!?

/christian


----------



## Noar (25. Mrz 2008)

Müssen die Elementnamen evtl. in korrekter Schreibweise abgefragt werden? Du Holst das Element mit dem Namen "datensatz", im XML gibt es aber nur "Datensatz". Groß- keinschreibung beachten?


----------



## Roar (26. Mrz 2008)

deine xml datei ist nicht well-formed, das heißt sie wird nichtmal geparst. außerdem sind Name und Haarfarbe keine attribute von Datensatz sondern kind-elemente (außerdem s. noars einwand)


----------



## Wolfgang Lenhard (26. Mrz 2008)

Wenn es Dir nur darum geht, Objekte in XML zu serialisieren und deserialisieren, dann erspart Dir XStream (xstream.codehaus.org) viel Arbeit.


----------



## chrgai (26. Mrz 2008)

Noar hat gesagt.:
			
		

> Müssen die Elementnamen evtl. in korrekter Schreibweise abgefragt werden? Du Holst das Element mit dem Namen "datensatz", im XML gibt es aber nur "Datensatz". Groß- keinschreibung beachten?


Ich habe die Groß/kleinschreibung in meinem Code richtig. Hab sie nur falsch übertragen.



			
				Roar hat gesagt.:
			
		

> deine xml datei ist nicht well-formed, das heißt sie wird nichtmal geparst. außerdem sind Name und Haarfarbe keine attribute von Datensatz sondern kind-elemente (außerdem s. noars einwand)


Warum ist die XML nicht well-formed? Jeder Tag wird wieder "geschlossen". Das ist doch die einzige Bedingung, oder?


----------



## Capasso (26. Mrz 2008)

Wohlgeformt
Ein wohlgeformtes Dokument bedeutet: 

- Ein XML-Dokument besteht aus einem Prolog und min. einem Element
- Es gibt nur ein Hauptelement
- Alle Elemente sind richtig verschachtelt
- Alle Attributwerte stehen in Anführungszeichen (doppelte oder einfache)
- Ein Element darf nicht zwei Attribute mit dem selben Namen besitzen
- Kommentare dürfen nicht direkt in den Elementen eingefügt werden
- Reservierte Zeichen, wie < oder > sind in der speziellen Form & bzw. & anzugeben


Also mindesatens das solltest du ändern:

```
<Datensatz> 
   <Name>Bernd</Name> 
   <Haarfarbe>Braun</Haarfarbe> 
</Datensatz> 
<Datensatz> 
   <Name>Norbert</Name> 
   <Haarfarbe>Blond</Haarfarbe> 
</Datensatz>
```

in 


```
<Datensaetze>
  <Datensatz> 
     <Name>Bernd</Name> 
     <Haarfarbe>Braun</Haarfarbe> 
   </Datensatz> 
  <Datensatz> 
     <Name>Norbert</Name> 
     <Haarfarbe>Blond</Haarfarbe> 
  </Datensatz>
</Datensaetze>
```


----------



## chrgai (30. Mrz 2008)

Auch die abgeänderte xml-Datei lässt sich nicht wie gewünscht einlesen.
Das XStream Projekt ist auch nicht das was ich brauche, da ich dann für
jeden Datensatz eine eigene Datei anlegen müsste. Ich will aber alles
in einer Datei unterbringen.
Da ich mittlerweile eine totale Denkblockade beim Thema xml habe, bitte
ich um Lösungsansätze.
Was soll der Code können:
Eine xml-Datei einlesen und für jeden Datensatz ein Objekt erzeugen.
Aus einem Vector<Datensatz> eine xml-Datei erzeugen.
Mehr nicht. Das kann doch nicht so schwer sein?!? Java soll ja xml-freundlich
sein, was mir schwer fällt zu glauben 

/christian


----------



## Wolfgang Lenhard (30. Mrz 2008)

Naja, man kann mit XStream auch eine Liste von Objekten, oder ein Array etc., also z. B. in Deinem Fall Vector<Datensatz> in eine einzelne Datei serialisieren. Das mache ich ständig und hatte noch nie Probleme.


----------



## chrgai (31. Mrz 2008)

Ich habe in deren Tutorial aber nichts der gleichen gesichtet. Hast du dazu eine Doku oder
ein Tutorial?


----------

