Eingang von XML & UTF8 ...

takidoso

Erfahrenes Mitglied
Hallo und Halli,
Ich habe da eine XML-Datei die & in einigen Inhalten hat.
In meinem Programm was da rübernudelt wird irgendwie automatisch ein & stattdessen umgesetzt. Ich hätte aber dann doch sehr gerne die Originalzeichenkette.
Gibt es irgendeine gute Möglichkeit das Original & zu bekommen ohne extra was programmeiren zu müssen? Ist vielleicht ein besonderer CharacterCode für den Ausgabe-Stream notwendig? Oder geht kein Weg daran vorbei den Kram programmatisch zu übernehmen?

Für dienliche Hinweise danke ich im Voraus

Takidoso
 
Nachtrag ...
Ich verwende zum Schreiben einen PrintWriter, der mit UTF8 als Code-Page initialisiert wurde. Muss ich das irgendwie anders machen, Ich benötige allerdings UTF8 :-/
 
Da ich keinerlei andere Möglichkeit gesehen habe habe ich das nun mit einem FilterWriter gelöst.

Java:
mport java.io.FilterWriter;
import java.io.IOException;
import java.io.Writer;


public class AmpFilterWriter extends FilterWriter
{	
	public AmpFilterWriter(Writer w)
	{
		super(w);
	}
	
	
	public void write(int c) throws IOException
	{
		switch (c)
		{			
			case '&' :
				out.write("&");
				break;			
			default :
				out.write(c);
		}
	}

	public void write(char[] cbuf, int off, int len) throws IOException
	{
		for (int i = off; i < len; i++)
		{
			write(cbuf[i]);
		}
	}

	/**
	 * Writes a portion of a string.
	 */
	@Override
	public void write(String s, int off, int len) throws IOException
	{
		for (int i = off; i < len; i++)
		{
			write(s.charAt(i));
		}
	}

}

Dieser wird dann wie folgt verwendet:
Java:
...
    		AmpFilterWriter ampFilterWriter = new AmpFilterWriter(new BufferedWriter(
    				                                                   new OutputStreamWriter(
    				                                                		   new FileOutputStream(fileName), "UTF8")));
    		
    		PrintWriter writer = new PrintWriter(ampFilterWriter);
...
 
Irgendwie ist die obige Lösung glaube ich noch nicht ganz das Gelbe vom Ei.
Denn in XML sind ja auch noch andere Sonderzeichen wie Größer- und Kleiner-Zeichen
und andere auf bestimmte weise codiert.
Kann mir jemand sagen, durch was eigetnlich die XML-Dateien ihre ursprüngliche Decodierung dieser Sonderzeichen erfahren? Ist es der XML-Parser selbst, oder passier dies erst durch den PrintWriter den ich einsetze?

bin wirklich dankbar für jemanden der es weiß und es mir sagen kann, denn meine Lösung oben ist vermutlich nur eine Symptombehandlung.
 
Das bestimmte Zeichen (<, &) nicht innerhalb eines XML Dokuments nicht erlaubt sind sollte klar sein. Ansonsten könnte man diese ja nicht als Steuerzeichen (in diesem Fall "Tag öffnen" oder "Entity Referenz definieren") benutzen. Also maskiert man diese in der Form



Für den Unicode Point in Dezimalnotation

oder



Für den Unicode Point in Hexadezimalnotation

maskiert.

Für manche Zeichen gibt es einen logischen Namen, welcher das Unicode Zeichen repraesentiert.

Aus

&lt; (less than) wird <
&amp; (ampersand) wird &
&quot; (quotation mark wird "
usw.

http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references

Diese Funktion wird durch die von dir genutzte XML API bereitgestellt. Wie sollte man denn sonst wohlgeformte XML Dokumente erstellen koennen, wenn man nicht erlaubte Sonderzeichen innerhalb seiner Daten hat?

Also Frage ich mich:
Wieso benötigst du den Inhalt der Elemente mit den Entity Referenzen? Diese Zeichen werden ja aus einem sinnigen Grund so maskiert.
 
Hallo,

du könntest eine <![CData[....]]> Sektion um deinen Text im XML Dokument herumlegen.
Dann werden die entsprechenden XML Entities nicht konvertiert.

Gruß Tom
 
Das bestimmte Zeichen (<, &) nicht innerhalb eines
Also Frage ich mich:
Wieso benötigst du den Inhalt der Elemente mit den Entity Referenzen? Diese Zeichen werden ja aus einem sinnigen Grund so maskiert.
Folgendes für die nähere Erklärung:
Das Programmle ist eine Art Splitter. Es liest den Inhalt einer gegebenen XML und teilt bestimmte Einträge aufgrund ihrer Inhalte auf verschiedene XML-Dateien gleichen Typs.
Das Programm bekommt (ohne dass ich es eigetnlich will) "aufgelöste" Sonderzeichen, was natürlich für die Ziel XMLs falsch ist. Mein 1. Ansatz war dieses wieder beim Schreiben erneut zu maskeiren, was aber bei Sonderzeichen wie Größer- und Kleiner-als In algorithmische Arbeit ausartet (denn Tags werden ja auch lustig übernommen (das Programm verwendet für die Entscheidung ob in Töpfen oder Kröpfchen nur bestimmte Tags).
Also wäre ein Ansatz die Sonderzeichen maksiert (und nicht irgendwo mir unbekannterweise automatisch demaskiert) zu bekommen sicher Sinnvoller und Schmerzloser.
 
Hallo,

na wenn du einfach nur das XML Dokument in mehrere Fragmente aufsplitten willst kannst du auch XSLT verwenden (TransformerFactory ...) In deinem Stylesheet kannst du dann genau steuern, ob und wie Entity Referenzen aufgelöst werden sollen.

Gruß Tom
 
Hallo,

du könntest eine <![CData[....]]> Sektion um deinen Text im XML Dokument herumlegen.
Dann werden die entsprechenden XML Entities nicht konvertiert.

Gruß Tom

klingt interessant, aber die Dateien selbst sind gegeben, an denen kann ich so erstmal nicht direkt was ruckeln. Mir fehlt da irgendwie noch die Vorstellungskraft Deinen Vorschlag programmatisch innerhalb der SAX-Anwendung nachzubilden. Verstehe ich das richtig, dass diese Umwandlung schon im "SAX-Getriebe" bewerkstelligt wird? Gibt es vielleicht irgendeine Option das auszuschalten?
 
Folgendes für die nähere Erklärung:
Das Programmle ist eine Art Splitter. Es liest den Inhalt einer gegebenen XML und teilt bestimmte Einträge aufgrund ihrer Inhalte auf verschiedene XML-Dateien gleichen Typs.
Das Programm bekommt (ohne dass ich es eigetnlich will) "aufgelöste" Sonderzeichen, was natürlich für die Ziel XMLs falsch ist. Mein 1. Ansatz war dieses wieder beim Schreiben erneut zu maskeiren, was aber bei Sonderzeichen wie Größer- und Kleiner-als In algorithmische Arbeit ausartet (denn Tags werden ja auch lustig übernommen (das Programm verwendet für die Entscheidung ob in Töpfen oder Kröpfchen nur bestimmte Tags).
Also wäre ein Ansatz die Sonderzeichen maksiert (und nicht irgendwo mir unbekannterweise automatisch demaskiert) zu bekommen sicher Sinnvoller und Schmerzloser.

Selbst in diesem Fall besteht meines Erachtens kein Problem.

Source XML Dokument wird ausgelesen (XML Libary) -> Sonderzeichen werden dekodiert(XML Libary) -> Daten werden sortiert und aufgeteilt (Splitter) -> Sonderzeichen werden enkodiert (XML Libary) -> Ziel XML Dokumente werden geschrieben (XML Libary).
 
Zurück