# Wie einen String(XML Inhalt) in eine XML Datei speichern?



## Titanpharao (20. Okt 2008)

Hey, suche schon total lange bei google und habe auch etwas gefunden. 

"XMLOutputter" aber irgendwie habe ich nicht das richtige Document Format.

Also ich habe einen String, in dem sind jetzt ein parr Tags leer da ich inhalte gelöscht habe. Jetzt möchte ich diesen wieder in eine Datei speichern. Ich denke ein Parser würde die leeren Tags selbst weglöschen?
Nur wie funktioniert das?  Also von einen XML-String in eine Datei.


----------



## FoundYa (20. Okt 2008)

Vielleicht hilft dir dies schon...

http://www.java-forum.org/de/topic76367_xml-dateiausgabe-string-umleiten.html


----------



## Titanpharao (20. Okt 2008)

Irgendwie bleibts bei mir immer Rot ...

Möchte doch nur aus einer XML Datei alle leeren Tags rauswerfen :'(

Also sowas 

<tag1>
<tag2>
</tag2>
</tag1>

...


----------



## pinhead84 (20. Okt 2008)

Titanpharao hat gesagt.:
			
		

> Ich denke ein Parser würde die leeren Tags selbst weglöschen?


Der XML-Parser / XML-Writer macht sowas in jedem Falle nicht automatisch, es ist ja schließlich nicht seine Aufgabe den XML-Code zu interpretieren.



			
				Titanpharao hat gesagt.:
			
		

> Möchte doch nur aus einer XML Datei alle leeren Tags rauswerfen :'(


Der Sinn erschließt sich mir nicht. Jedenfalls ist das Problem nicht so trivial, wie man meinen könnte.



			
				Titanpharao hat gesagt.:
			
		

> Also sowas
> 
> <tag1>
> <tag2>
> ...


In deinem Beispiel sind beide Tags nicht leer:

(a) tag2 beinhaltet einen Leerstring / Zeilenumbruch
(b) tag1 beinhaltet tag2

Ein allgemeiner Automatismus, der <tag2> & <tag1> automatisch entfernt und wieder als XML-Datei speichert, kann zu einer ungültigen XML-Datei führen, die nicht mehr ihrem XSD-Schema entspricht. Nicht mal ein <tag3/> könnte man automatisiert löschen, ohne Konflikte mit dem Schema zu provozieren.

Dein Programm müsste rekursiv gegen das jeweilige Schema prüfen, ob das zu löschende Tag ein Pflichtfeld ist oder nicht.


----------



## Titanpharao (20. Okt 2008)

Es gibt keine XSD dazu. Die XML Files sind diff Files und werden regeneriert. Zeilenumbruch zählt nicht ... und wenn ich tag2 lösche ist tag 1 wieder leer 

Oder wie kann ich mit JDom auf leere Tags prüfen(ganz zu schweigen vom einlesen und schreiben, das will bei mir gerade überhaupt nicht  )


----------



## pinhead84 (20. Okt 2008)

> Zeilenumbruch zählt nicht ... und wenn ich tag2 lösche ist tag 1 wieder leer


Ich wollte dir damit auch nur darstellen, dass 'leer' durchaus relativ sein kann. Dein Algorithmus müsste in jedem Falle rekursiv vorgehen, wie du ja schon andeutest. Wenn dir die Gültigkeit der XML-Dokumente egal sein kann, wäre XSLT eine stressfreie Alternative.



> Oder wie kann ich mit JDom auf leere Tags prüfen


Dafür hast du alle möglichen Methoden in der Element-Klasse, z.B. getContent() oder getText().

Ein XML-Element wird vermutlich leer sein, wenn

```
element.getContent().isEmpty() && element.getText().trim().isEmpty()
```


----------



## Titanpharao (21. Okt 2008)

Klappt leider nicht, der sieht den Zeilenumbruch als Text ... :autsch: 

Habe mal das probiert, löscht auch die äußersten Tags. In unserm Beispiel tag2, aber tag1 hat auf einmal 2Content? habe doch das eine herrausgelöscht?


```
private static int getCountsofChild(Element element){
		int count=0;
		for(int i=0;i<element.getChildren().size();++i){
		
		Element ele=(Element)element.getChildren().get(i);
		if(ele.getText().trim().equals("")&&ele.getContent().size()==1){
//			System.out.println("Remove");
//			System.out.println("Tag:"+ele.getName());
//			System.out.println("Text:"+ele.getText().trim());
			element.getChildren().remove(i);
		}
//		System.out.println("Tag:"+ele.getName());
//		System.out.println("Text:"+ele.getText().trim());
//		System.out.println("ContentSize:"+ele.getContentSize());
//		System.out.println("Content:"+ele.getContent());
//		System.out.println(count);
		count=element.getChildren().size();		
		if(count>0)getCountsofChild((Element)element.getChildren().get(i));
		}
		
		return 0;
	}
```


----------



## pinhead84 (21. Okt 2008)

Titanpharao hat gesagt.:
			
		

> Klappt leider nicht, der sieht den Zeilenumbruch als Text ... :autsch:


Ich hab dich ja gewarnt.  - Hast du schonmal getTextTrim() versucht? - Im Notfall sollte auch ein String.replaceAll() funktionieren.



			
				Titanpharao hat gesagt.:
			
		

> Habe mal das probiert, löscht auch die äußersten Tags. In unserm Beispiel tag2, aber tag1 hat auf einmal 2Content? habe doch das eine herrausgelöscht?


Aus dem Bauch heraus, schaut mir der Algorithmus auch noch nicht ganz korrekt aus. Ich denke es ist einfacher, den rekursiven Abstieg in diesem Falle zu Beginn in der Schleife zu machen, nicht am Ende.

```
private static int getCountsofChild(Element element){

		int count=0;
		if (!element.getTextTrim().trim().isEmpty()) count++;

		// Child-Tags prüfen
		for(int i=0;i<element.getChildren().size();i++){

			// rekursiver Prüfung der Child-Tags                
			Element child = (Element)element.getChildren().get(i);
			if (getCountsofChild( child )==0) element.removeContent( child );
			else count++;
		}

		return count;
	}
```
Habe den Code nicht getestet, also kein Gewähr für Korrektheit.


----------



## Titanpharao (21. Okt 2008)

ja sowas inner art habe ich mitlerweile auch  danke vielmals ich hacke mal ab


----------

