# Schreiben einer XML



## Tomas (14. Dez 2010)

hallo,

ich schreibe in eine XML, dass funktioniert auch schon ganz gut...nur habe ich das Problem, dass ich meine Elemente nicht in eine neue Zeile hänge.

Der Code:

```
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;

// so hänge ich die elmente rein

Element element= document.createElement("Node");
		node.setAttribute("i:type", typeNode.name());
parentElement.appendChild(node)

--------------------------------------------------

// schreibt raus
Source source = new DOMSource(document);
		// output file
		File file = new File(filePath);
		Result result = new StreamResult(file);
		// write the dom document to file
		Transformer xformer = null;
		try {
			xformer = TransformerFactory.newInstance().newTransformer();
			xformer.transform(source, result);
		} catch (TransformerException e) {
			e.printStackTrace();
		}
```

Ich dachte, es würde mit appendChild funktionieren doch es gibt mir eine riesen lange Wurst aus....

Wie kann ich nach jedes element in eine neue zeile reingeben, sodass ich die typische xml form habe

<xxx>...
  <yyy>...
      <zzz>...</zzz>
  </yyy>
</xxx>

Danke!


----------



## SlaterB (14. Dez 2010)

im Zweifel mit voller Kontrolle manuell Knoten für Knoten, etwa mit
XML Document Writer : WriterXMLJava


----------



## Tomas (14. Dez 2010)

Nein genau so nicht....


----------



## Noctarius (14. Dez 2010)

Pretty-printing output from javax.xml.transform.Transformer with only standard java api (Indentation and Doctype positioning) - Stack Overflow


----------



## grindelaner (15. Dez 2010)

Warum verwendest du kein JAXB?
Dann müsstest du dir um solche Sachen keine Sorgen machen.

Was hast du mit der XML-Datei vor?


----------



## Noctarius (15. Dez 2010)

Das hat doch mit JAXB nichts zu tun, er kann (wie im Link) auch beim Transformer PrettyPrint aktivieren. Sowas sollte aber eben nur für Debugzwecke an sein.


----------



## donnac (12. Jan 2011)

hi,
meine Frage passt ganz gut zum Titel, daher poste ich sie mal hier:
ich habe eine GUI entwickelt, in die u.a. Daten, ähnlich Adressdaten, eingegeben werden können (in Tabellen angezeigt). 
Diese möchte ich nun speichern, aufgrund der Struktur der Daten würde sich XML vermutlich gut dazu eignen. Leider kenne ich mich mit XML so gut wie gar nicht aus. JAXB habe ich schon gefunden, finde die Erklärungen dazu allerdings recht komplex, zumal alle Welt irgendwie davon auszugehen scheint, dass man zuerst die Daten/Klassen(?) in XML-Form hat, das ist bei mir allerdings nicht der Fall ist. 
Mit 

```
JAXB.marshal(src, System.out);
```
erhalte ich schon ein ganz nettes Beispiel:


```
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<source>
    <connectState>0</connectState>
    <host>local</host>
    <name>heidi</name>
    <port>12345</port>
    <streamIdentifier>pumbeidi</streamIdentifier>
    <height>56.0</height>
    <powerControl>0</powerControl>
</source>
```

Allerdings wird nicht alles ausgegeben.
Und zwar enthält der Datentyp mehrere Variablen und darunter auch eine ArrayList<anderer Datentyp>, wobei der Inhalt der ArrayList nicht ausgegeben wird.
Es sollte eigentlich noch etwas in der Art 

```
<attributeList>
<element><name>bla<\name><type>SPEED<\type><\element>
<element><name>blub<\name><type>POWER<\type><\element>
</attributeList>
```
 auftauchen.
ich vermute, dass ich noch irgendetwas konfigurieren muss, bzw. JAXB mitteilen, dass da diese Liste ist, die mit zu parsen ist. Sämtliche Klassen (auch von dem Datentyp der ArrayList), die ich verwende haben public getter, daran liegt es also nicht, zumal ich auch keine Fehlermeldung bekomme.

Ich möchte nichts großartiges damit machen, es soll einfach die bisherige Usereingabe in eine XML-Datei geparst werden und beim Laden wieder eingelesen. Die JAXB Dokumentation finde ich nur für den Zweck etwas zu umfangreich :rtfm:  . Falls also jemand von euch sagt "na, das ist doch ganz einfach, du musst da nur dfhfkshkhdf = ndkdkfn() angeben" dann wäre ich schon überglücklich. :toll:


----------



## Noctarius (12. Jan 2011)

Vielleicht hilft dir das weiter:
3.2.2. Use @XmlJavaTypeAdapter -> Unofficial JAXB Guide - Mapping interfaces &mdash; Project Kenai


----------



## donnac (12. Jan 2011)

Das sieht übersichtlich aus, Danke!  Das werde ich mir mal durchlesen.

Inzwischen habe ich auch festgestellt, warum meine Daten nicht "marshaled" wurden: sie waren einfach nicht da. Ich habe die Liste zwar dynamisch erstellt, aber nicht immer hinzugefügt (je nach dem, wie man sich durch die GUI klickte, wurde sie dem anderen Objekt hinzugefügt oder nicht, und bisher war mir das nicht aufgefallen (da sie in der resultierenden Tabelle sowieso nicht angezeigt werden). *dank an xml, obwohl es nichts damit zu tun hat*
Also, wie immer: die größte Gefahr sitzt *hinter* der Tastatur!


----------

