Java Xml nur nach End-Tag Zeilenumbruch

Sascha84

Lt. Junior Grade
Registriert
Jan. 2008
Beiträge
293
Hallo miteinander,

wer kann mir helfen! Ich versuche eine XML Datei so zu formatieren, dass immer nach einem End-Tag ein Zeilenumbruch gemacht wird.
Bisher hab ich es geschafft, nach jedem Schließen-Tag einen Umbruch zu bekommen.
Komm einfach nicht weiter :(


Code:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class HostXMLStatementConv
{
	private BufferedReader fi;
	private BufferedWriter fo;
	private String line;

	public HostXMLStatementConv(String datei_ein, String datei_aus)
	{
		try
		{
			StringBuilder all_content = new StringBuilder();
			this.fi = new BufferedReader(new BufferedReader(new InputStreamReader(new FileInputStream(datei_ein), "UTF-8")));
			this.fo = new BufferedWriter(new BufferedWriter(new OutputStreamWriter(
		              new FileOutputStream(datei_aus), "ISO-8859-1")));

			while ((this.line = this.fi.readLine()) != null)
			{
				all_content.append(line);

			}

			boolean has_slash = false;

			StringBuilder formatted_all_content = new StringBuilder(
					all_content.toString());

			StringBuilder strbuilder = new StringBuilder();

			for (int i = 0; i < all_content.length(); i++)
			{
				strbuilder.append(all_content.charAt(i));

				if (all_content.charAt(i) == '<')
				{ // wenn Tag beginnt

					if (i + 1 < all_content.length()) // wenn Zähler nicht Ende
						
						
						if (all_content.charAt(i) == '<'){
							
							has_slash = true;// des Strings erreicht
						}
														// hat,
						if (all_content.charAt(i + 1) == '/')  
						{
							has_slash = true;

						}
				}

				if (all_content.charAt(i) == '>')
				{
					// wenn Tag ended

					if (has_slash)
					{

						strbuilder.append("\r\n");

					}
					has_slash = false;
				}

			}
			this.fo.write(formatted_all_content.toString()
					.replaceAll("<","<").replaceAll(">",">\r\n"));

			//

			this.fi.close();
			this.fo.close();
		}
		catch (IOException e)
		{
			System.out.println("Fehler beim Lesen/Schreiben einer Datei " + e);
		}
	}
}
 
Zuletzt bearbeitet:
Reguläre Ausdrücke könnten dir da helfen.
PS:Im Konstruktor einer Klasse sollte niemals Programmlogik stehen.
 
Google nach "java xml pretty print" befragen liefert mehrere Ansätze.

Du bist mit einer Lösung über einen XML-Parser sicherlich besser bedient, als diese ganze Textmanipulation.
 
habs nun gelöst mit regular expressions

Code:
this.fo.write(formatted_all_content.toString().replaceAll("<\\/(.+?)>", "<\\/$1>\r\n"));
 
RioCoding schrieb:
Du bist mit einer Lösung über einen XML-Parser sicherlich besser bedient, als diese ganze Textmanipulation.

So sieht's aus.

XML in Verbindung mit regulären Ausrücken endet meist im unsauberer Frickelei, so auch hier. Was machst du beispielsweise mit empty tags? Was mit schließenden Tags, die nicht Bestandteil von XML sind (z.b. in CDATA) ?

http://stackoverflow.com/questions/1384802/java-how-to-indent-xml-generated-by-transformer als schnelle Lösung, ansonsten gibt es auch third party libs dafür, die mehr Optionen bieten.

Regex und XML in einem Satz ist in 99,9% der Fälle Mist.
 
Zuletzt bearbeitet:
Zurück
Oben