# Anfängerfrage zu XML



## osix (7. Nov 2019)

Hallo liebe Java Gemeinde,

ich habe hier XML Dateien, als Leergerüst, da stehen schon viele Tags drin wie

<Startdatum></Startdatum>
<Endedatum></Endedatum>

usw.

wie kann ich möglichst einfach dort die Daten, die ich aus TXT.Dateien auslese, reinschreiben.
Also, die leere XML Dateien möchte ich am liebsten verwenden, nicht umständlich, den ganzen XML Baum wieder rausschreiben.

Mit welcher lib mache ich das ?

Link auf ein Beispiel genügt

Besten Dank schon im Vorraus !


----------



## kneitzel (7. Nov 2019)

Also zum einen möchte ich darauf hinweisen, dass es im online verfügbaren Buch "Java ist auch eine Insel" ein ganzes Kapitel zu XML gibt: http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_18_001.htm - da findet sich eine gute Übersicht incl. der gebräuchlichen Techniken.

Es gibt generell viele Wege, wie man so XML Dateien schreiben kann. Ein Weg wäre z.B. mittels jaxb Java Objekte in XML Dokumente zu schreiben.
Man könnte aber auch XML Dokumente über org.w3c.dom.Document aufbauen. Das wäre dann etwas mehr manuelle Arbeit, aber würde z.B. unter https://www.mkyong.com/java/how-to-create-xml-file-in-java-dom/ etwas beschrieben (oder eben im "Java ist auch eine Insel".

Generell musst Du die XML Datei lesen und dann komplett schreiben. Dateien bieten halt nicht dieses einfügen.
Aber es ist auch denkbar, dass du die XML Datei mittels SAX Parser liest und parallel halt in einer anderen Datei schreibst incl. zusätzlichen Informationen.


----------



## osix (28. Nov 2019)

Ich hab das jetzt händisch gelöst, war mir alles zu aufwändig.

Sprich, zeilenweise Datei lesen, nach "><" suchen, und in die Mitte die Info reinschreiben.

Nicht schön, aber in meinem Fall geht es, weil es nur solche Tags sind und zudem nicht zuviele.


----------



## mihe7 (28. Nov 2019)

osix hat gesagt.:


> Ich hab das jetzt händisch gelöst, war mir alles zu aufwändig.
> 
> Sprich, zeilenweise Datei lesen, nach "><" suchen, und in die Mitte die Info reinschreiben.
> 
> Nicht schön, aber in meinem Fall geht es, weil es nur solche Tags sind und zudem nicht zuviele.


Jetzt weiß ich, warum ich immer wieder mal "XML"-Dateien bekomme, die nicht valide sind. Et und Kleiner lassen grüßen.


----------



## Maliko (27. Dez 2019)

Vor allem frage ich mich was daran großartig aufwändig sein soll? Man baut sich einfach eine Datenklasse nach dem Modell der XML und schmeißt die in JAXB.marshal(), übergibt noch nen String/StreamWriter und fertig. Anschließend hat man im StringWriter dann die fertige XML-Datei, welche nur noch abgespeichert werden muss (ich benutze, sie momentan z.B. zum Loggen von Requestobjekten in der Datenbank.

Beispiel:

```
import javax.xml.bind.JAXB;

public class RequestLogger {
    private String convertToXml(Object obj) {
        StringWriter writer = new StringWriter();
        JAXB.marshal(obj, writer);
        
        return writer.toString();
    }
}
```

Meine Publicfunktionen hab ich der Übersichtlichkeit halber einfach mal rausgelassen. Also nicht wundern, dass da nur ne private-Funktion drin ist.


----------



## mihe7 (27. Dez 2019)

In dem Fall geht es ja noch nicht einmal um die Erzeugung, sondern einfach nur darum, bestehende XML-Dateien zu verarbeiten. Lesen, ändern, schreiben - fertig.


----------



## Maliko (27. Dez 2019)

Was genauso einfach ist. Dafür muss man lediglich die JAXB-Annotations verwenden und kann das XML-Doc problemlos in die Datenklasse parsen. Aber ja ich denke mal wir sind uns einig, dass seine Lösung eigentlich erheblich umständlicher und vor allem auch Fehleranfälliger ist.


----------



## kneitzel (27. Dez 2019)

Wenn Datenklassen existieren, aber die braucht man ja noch nicht mal. Die DOM Struktur reicht ja vollkommen aus, also einmal einladen, Anpassungen machen, und dann einfach speichern. Und wenn es um sehr umfangreiche Dokumente gehen sollte, dann wäre tatsächlich ein SAX Parser interessant, so dass man da halt nicht alles im Speicher halten muss.

Aber die Möglichkeiten sind sehr vielseitig und daher wäre meine Empfehlung, sich die Möglichkeiten generell einmal im Detail anzusehen. Java ist auch eine Insel mag nicht die beste Möglichkeit sein, aber dort werden diverse Optionen aufgezeigt.

Aber man kann niemanden zwingen, es ordentlich zu lösen. Wenn jemand meint, das wirklich mit den entsprechenden Suchen und Ersetzen Methoden zu machen, dann ist es halt so.


----------

