# Beim Erzeugen einer XML Datei auch die XML Struktur erzeugen?



## sylo (15. Apr 2010)

Hi zusammen

folgendes Problem:
ich habe eine XML File die wird mittels DOM eingelesen verändert und soll nun wieder in eine XML Datei reingeschrieben werden.

einlesen geht.

verändert wird das document mit:


```
Node node = (Node) path.getLastPathComponent();

						Element element = parser.getDomXML().createElement(
								nodeValue);
						Text text1 = parser.getDomXML().createTextNode("");
						Text text2 = parser.getDomXML().createTextNode("");
		
						element.appendChild(text1);
						node.appendChild(element);
						node.appendChild(text2);
```

und in die Datei schreibe ich mit:


```
File file = new File(storedFile);
	        				
				// Prepare the DOM document for writing
				DOMSource source = new DOMSource(doc);

				// Prepare the output file
				
				StreamResult result = new StreamResult(file);

				// Write the DOM document to the file
				Transformer xformer = TransformerFactory.newInstance()
						.newTransformer();

				xformer.setOutputProperty(OutputKeys.STANDALONE, "yes");
			    xformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
				xformer.setOutputProperty(OutputKeys.INDENT, "yes");
				xformer.transform(source, result);
```

Das Problem was ich habe, ist dass beim reinschreiben alle neu hinzugefügten Elemente nebeneinander geschrieben werden, und nicht so wie es in einer XML Datei aussehen sollte.

Ich habe es in auch schon mit

```
Text text1 = parser.getDomXML().createTextNode("\n");
```
oder

```
Text text1 = parser.getDomXML().createTextNode("\n\r");
```
probiert, das bringt aber auch nicht das gewünschte Ergebnis.

Bin für jeden Tipp dankbar.

Grüße


----------



## sylo (16. Apr 2010)

keiner einen tipp?


----------



## pizza1234 (16. Apr 2010)

Hi,
Vielleicht hilft dir das weiter?

Grüße
Peter


----------



## sylo (16. Apr 2010)

Also mit dem XMLSerializer von Xerces funktioniert es. 

Aber mit dem Transformer nicht. Aber ich hätte es gerne mit dem Transformer hinbekommen, weil so müsste ich keine externe jar hinzufügen.

Also falls dir oder jemand anderem noch was einfällt, hier bin ich 

Grüße


----------



## sylo (11. Aug 2010)

Hi

Das Problem mit dem Transformer habe ich mittlerweile gelöst. Es ist nun aber ein weiteres Problem entstanden, wofür ich keinen neuen Thread aufmachen wollte.

Das Problem an sich ist das Gleiche. Wenn ich Knoten hinzufüge werden die in eine Zeile geschrieben. Nun bräuchte ich aber schon im DOM Dokument die XML-Struktur. 

Um das Dokument in eine Datei zu transformieren, mache ich folgendes:

```
t.transform(new DOMSource(document), new StreamResult(new OutputStreamWriter(
						new FileOutputStream(file))));
```

Das funktioniert auch wunderbar mittels den Properties die setze:

```
t.setOutputProperty(OutputKeys.INDENT, "yes");
```

Gibt es da nun eine Möglichkeit mit dem Transformer das Dokument in das gleiche Dokument zu transformieren. Also so was wie:

```
t.transform(new DOMSource(document), new DOMSource(document));
```
Ich weiß die Methode transform() will als zweiten Parameter einen StreamResult. Das soll nur verdeutlichen was ich machen möchte.
Vielleicht gibt es da ja eine Möglichkeit das das Dokument schön sortiert wird. Ich habe es mit der Methode normalize() der Klasse Node versucht, die macht aber nicht das was ich möchte.

Grüße
sylo


----------



## sylo (12. Aug 2010)

Hi

ich war ja garnicht so weit weg. Man kann der transform()-Methode auch folgende Parameter übergeben:

```
t.transform(new DOMSource(), new DOMResult())
```

Nun versuche ich folgendes:

```
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();

Document tempDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder()
							.newDocument();

t.transform(new DOMSource(originalDoc), new DOMResult(tempDoc));
t.transform(new DOMSource(tempDoc), new DOMResult(originalDoc));
```

Nach dem zweiten transform schmeißt er mir die Exception:

```
javax.xml.transform.TransformerException: org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: An attempt was made to insert a node where it is not permitted.
```

Ich weiß nicht warum diese Exception kommt. Ich muss aber auch gestehen dass ich nicht ganz verstehe was in der API steht DOMResult (Java 2 Platform SE 5.0). Vielleicht kann mir das einer erklären.

Grüße
sylo


----------



## Noctarius (12. Aug 2010)

Die Frage ist doch, was soll es dir bringen das Ganze 2x zu transformieren?


----------



## sylo (12. Aug 2010)

Hi

Damit versuche ich zu erreichen, dass mein originalDoc formatiert wird und somit die gewünschte XML-Struktur vorhanden ist. Wenn ich die Transformation nur einmal mache, dann habe ich die Struktur ja im neuen Document (tempDoc). Ich bräuchte sie aber im originalDoc.

Grüße
sylo


----------



## Noctarius (12. Aug 2010)

Wieso nicht einfach wegschreiben und das Document neu einlesen oder das neue Document dem alten zuweisen / aus der Funktion als Rückgabe rauswerfen?


----------



## sylo (12. Aug 2010)

Hi

In meinem Tool wird ein Jtree verwendet um die XML-Datei darzustellen. Eine Zuweisung des neuen Documents dem alten hatte ich schon ausprobiert. Hier habe ich aber das Problem das der Baum der angezeigt wird immer noch vom alten Document dargestellt wird. Da bekomme ich dann z.B. ein WrongDocument Fehler wenn ich einen Knoten hinzufügen möchte. Wenn ich aber den Baum vorher aktualisieren würde, dann habe ich das Problem, dass ich sämtliche Knoten die vorher offen waren mir merken muss um diese dann, nach der Aktualisierung, wieder zu öffnen. Wobei ich dann diese Pfade mittels XPath manuell aufbauen muss, da es ja ein anderes Document ist. 
usw. usw. Da ist noch ein langer Rattenschwanz hinten dran. Das würde so zwar gehen, aber die Performance würde darunter leiden. Deswegen der versuch das original Document zu verändern.

Grüße
sylo


----------



## Noctarius (12. Aug 2010)

Dann geh Node für Node das neue Dokument durch und hole fehlende Knoten mit adoptNode ins alte Dokument Document (Java Platform SE 6))


----------



## sylo (12. Aug 2010)

Hi

das wäre eine Möglichkeit. Muss ich ausprobieren. Meld mich dann wenn ich implementiert habe. 

Danke dir Noctarius schon mal im Vorraus.

Grüße
sylo


----------

