# In XML Sichern



## Max91 (7. Mrz 2014)

hi,

so wie ich mein code geschrieben habe kann ich ein xml dokument erzeugen und speichern.
jetzt will ich aber nicht den namen festlegen die ich zwischen den tags schreibe, sondern sollen diese durch den Benutzer an der richtigen stelle automatisch eingefügt werden. wie kann man das machen ?
außerdem wird mein xml dokument immer überschrieben und erweitert sich nicht einfach, wie kann man das programmieren?

Lg





```
public class FileHandler  {
    
    public void sichernVonDaten() {

        try {
            
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
            Document doc = docBuilder.newDocument();

            if(doc != null) {
           
            //rootelement
            Element rootElement = doc.createElement("cocktails");
            doc.appendChild(rootElement);
            
            //cocktail
            Element cocktail = doc.createElement("cocktail");
            rootElement.appendChild(cocktail);
     
            //allgemein
            Element allgemein = doc.createElement("allgemein");
            cocktail.appendChild(allgemein);
            
            
            //kindElement name von allgemein
            Element name = doc.createElement("name");
            //hier erstellt man den namen des cocktails
            name.appendChild(doc.createTextNode("hier steht ei name));
            allgemein.appendChild(name);
     
            //kindelement street von allgemein
            Element note = doc.createElement("note");
            note.appendChild(doc.createTextNode("...."));
            allgemein.appendChild(note);
            
            //kindelement alkohol von allgemein
            Element alkohol = doc.createElement("alkohol");
            alkohol.appendChild(doc.createTextNode("..."));
            allgemein.appendChild(alkohol);
            
            //zutaten
            Element zutaten = doc.createElement("zutaten");
            cocktail.appendChild(zutaten);
            //zutat
            Element zutat = doc.createElement("zutat");
            zutaten.appendChild(zutat);
            //kindElement zname von zutat
            Element zname = doc.createElement("zname");
            zname.appendChild(doc.createTextNode("..."));
            zutat.appendChild(zname);
            //kindElement cocktailmenge von zutat
            Element cocktailmenge = doc.createElement("cocktailmenge");
            cocktailmenge.appendChild(doc.createTextNode());
            zutat.appendChild(cocktailmenge);
            //kindElement menge von zutat
            Element menge = doc.createElement("menge");
            menge.appendChild(doc.createTextNode(""));
            zutat.appendChild(menge);
            //kindElement handelspreis von zutat
            Element handelspreis = doc.createElement("handelspreis");
            handelspreis.appendChild(doc.createTextNode(""));
            zutat.appendChild(handelspreis);
            //kindElement handelsmenge von zutat
            Element handelsmenge = doc.createElement("handelsmenge");
            handelsmenge.appendChild(doc.createTextNode(""));
            zutat.appendChild(handelsmenge);

            //zubereitung
            Element zubereitung = doc.createElement("zubereitung");
            cocktail.appendChild(zubereitung);
            //kindElement text von zubereitung
            Element text = doc.createElement("text");
            text.appendChild(doc.createTextNode("....."));
            zubereitung.appendChild(text);
            
            }
            // als XML schreiben 
            TransformerFactory tf = TransformerFactory.newInstance();
            Transformer serializer = tf.newTransformer();           
            DOMSource Source = new DOMSource(doc);
            File fileOutput = new File("xml/CocktailBestand.xml");
            StreamResult streamResult = new StreamResult(fileOutput);
            //Form des dokumentes
            serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
            serializer.setOutputProperty(OutputKeys.INDENT, "yes");
            serializer.transform(Source, streamResult);
            
           
            
        } catch (ParserConfigurationException pce) {
                pce.printStackTrace();
        } catch (TransformerException tfe) {
                tfe.printStackTrace();
        }
    }
```


----------



## JavaMeister (8. Mrz 2014)

Google: Java writing XML???

Bestimmt über eine Million Ergebnisse. Suche dir eins raus und stelle eine konkrete frage.


----------



## turtle (8. Mrz 2014)

Ich stimme JavaMeister zu und ergänze, das ICH an deiner Stelle mir genauer JAXB anschauen würde.

Ich kenne niemand der XML händisch selber schreibt. 

Hier mal Teil aus meinem Programm, welches XML schreibt, einen datensatz hinzufügt und als XML auf System.out ausgibt. Und alles benötigt "nur" zwei annotierte Klassen (Employees und Employee).


```
JAXBContext context = JAXBContext.newInstance(Employees.class);
			Unmarshaller unmarshaller = context.createUnmarshaller();
			FileInputStream fileInputStream = new FileInputStream(xmlFileName);
			Employees employees = (Employees) unmarshaller.unmarshal(fileInputStream);
			List<Employee> listEmployee = employees.getListEmployee();
			for (Employee employee : listEmployee) {
				System.out.println(employee);
			}
			Employee turtle = new Employee();
			turtle.setFirstname("turtle");
			turtle.setLastname("Turtle");
			turtle.setEmplid("5555");
			turtle.setAge("17");
			employees.add(turtle);
			Marshaller marshaller = context.createMarshaller();
			marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
			marshaller.marshal(turtle, System.out);
```

[XML]<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Employee emplid="5555">
    <firstname>turtle</firstname>
    <lastname>Turtle</lastname>
    <age>17</age>
</Employee>[/XML]


----------



## matze8426 (19. Jun 2014)

Ich stimme meinen Vorrednern zu.
Wenn du möchtest das ein Element name nicht name heißt, sondern der Benutzer festlegen soll, wie es heißt, musst du nur 

```
Element name = doc.createElement("name");
```
durch

```
Element name = doc.createElement(variable);
```
ersetzen.
In Variable steht dann ein String, den der Benutzer vorher eingegeben hat. Der Sinn warum man sowas machen sollte, erschließt sich mir allerdings nicht.


----------



## Thallius (19. Jun 2014)

Mal ganz davon abgesehen, dass eine XML-Datei als Speicherobject für eine Coctail-Datenbank (Die Art wie man es speicher sollte entnehme man dem Namen) sicher extrem ungeeignet ist.

Gruß

Claus


----------



## JavaMeister (19. Jun 2014)

> Mal ganz davon abgesehen, dass eine XML-Datei als Speicherobject für eine Coctail-Datenbank (Die Art wie man es speicher sollte entnehme man dem Namen) sicher extrem ungeeignet ist.



Warum?


----------



## Thallius (19. Jun 2014)

Du willst jetzt doch nicht ernsthaft behaupten das Speichern einer Datenbank in einer XML Datei sei in irgendeiner Weise sinnvoll?

Gruß

Claus


----------



## JavaMeister (19. Jun 2014)

Hast du überhaupt schon mal ein richtiges Projekt durchgeführt?

Worauf stützt du deine Behauptung?


----------



## Thallius (20. Jun 2014)

JavaMeister hat gesagt.:


> Hast du überhaupt schon mal ein richtiges Projekt durchgeführt?



Da ich mitlerweile seit über 25 Jahren freiberuflich arbeite und regelmäßig von Firmen wie der IHK-GFI oder GE gebucht werde... lass mich kurz überlegen.... Ich glaube JA!



> Worauf stützt du deine Behauptung?



Ich weiß, dass gerade bei Java Entwicklern die Floskel "Resourcen schonen" etrem gerne ignoriert wird und ich habe mich auch schon damit abgefunden aber eine Datenbank in eine XML zu speichern, so das man immer ALLE Daten erstmal einlesen muss um z.B. in brauchbarere Geschwindigkeit sortieren und filtern zu können, das setzt der Sache echt die Krone auf. 
Klar jetzt kommt wieder der Spruch "Aber bei 100 Coctails interessiert das doch keinen". Stimmt aber das wird ja nicht das letzte Projekt des TO. Und wenn es so einmal geklappt hat, dann macht er es das nächste mal wieder so und dann ist es vielleicht eine Adressdatei für einen Kunden? Also warum soll er es nicht gleich vernünftig machen und eine DB benutzen und dabei auch gleich lernen wie man damit arbeitet?

Ich lerne doch auch nicht erst Go-Cart fahren damit ich später Autofahren lernen kann.

Gruß

Claus


----------



## matze8426 (20. Jun 2014)

Jetzt habt euch doch mal wieder lieb ;-)
Natürlich gehört sowas in eine Datenbank, aber ich denke darum ging es in diesem Post ja auch überhaupt nicht, sondern darum, dass Max91 den Umgang mit XML lernt.


----------



## JavaMeister (21. Jun 2014)

> Jetzt habt euch doch mal wieder lieb



Darf ich in dem Forum nicht diskutieren, ohne dass man einem Vorwirft "sauer" zu sein? Unglaublich.



> Natürlich gehört sowas in eine Datenbank, aber ich denke darum ging es in diesem Post ja auch überhaupt nicht, sondern darum, dass Max91 den Umgang mit XML lernt.



Das ist der erste Punkt, den ich auch hätte hier aufgeführt, ist aber nun done.

Des Weiteren:

So wie dein Post für newbes geklungen hat, sind RDBMS pauschal gegenüber XML Dateien vorzuziehen. Und das ist einfach falsch.

Eine Datenbank muss nicht automatisch mehrere GB groß sein und millionen Daten beinhalten.

Es gibt sehr gute Anwendungsfälle für XML Storage bis zu mehreren Megabyte. Klar ist irgentwan eine Grenze erreicht, aber bis dahin sind XML Dateien einer Datenbank als Überlegung vorzuzuiehen 

Und das ist kein Vergleich von Gocart zu Auto. Mir fälllt kein Vergleich ein, der eine Gleichwertigkeit darstellt.

Bis dahin.


----------



## matze8426 (22. Jun 2014)

Klar darf man diskutieren und ich hatte gedacht das Smiley würde klar machen das es eher etwas sarkastisch gemeint war als ernst


----------

