Sonderzeichen in XML-Datei einbauen

Liebe/-r Experte/-in,
ich habe ein kleines Problem.

Ich programmiere in Java mit den org.w3c.dom-Klassen eine Anwendung, die aus einer Datenbank Daten ausliest und z. T. werden auch fertige XML-Snippets ersetzt.

Nun enthalten diese Snippets Sonderzeichen in folgender Codierung:
Beispiel: & #x002E;
(Das Space zwischen & und # dient nur dazu, dass der Code dargestellt und nicht gleich gewandelt wird.)
Diese Zeichen lassen sich in einem XML-Editor problemlos direkt eingeben und erscheinen dann im Browser z. B. als „.“.

Soweit so gut. Wenn ich mein XML zusammenstelle, dann sehe ich bei meinen XML-Dumps im Logfile auch, dass diese Zeichen korrekt dargestellt werden. Die Dumps erstelle ich mit getTextContent() oder getNodeValue(). Beide Methoden liefern mir die korrekte Darstellung.

Wenn ich jetzt die Datei auf die Platte schreiben lasse, bzw. ĂĽber den Tomcat zurĂĽckgeben lasse werden diese Zeichen dann in:
& amp;#x002E;
konvertiert (auch hier dient das Space zwischen & und amp; nur zur Darstellung fĂĽr diese Mail).

Wenn ich die Sonderzeichen als CDATA-Node eintrage funktioniert das Einwandfrei, allerdings kann die Gegenseite das nicht verarbeiten, da dann nicht das Zeichen, sondern der Code dargestellt wird.

Hat irgendjemand eine Idee, wie ich die Sonderzeichen in das XML einbauen kann, so dass nachher im Code ‎ steht?
Ich vermute es liegt an der Codierung bei der Ausgabe des XMLs.

Vielen Dank im voraus fĂĽr Eure Hilfe!

GruĂź
Thomas

Hi, Thomas

leider kann ich auch nur spekulieren, da ich dieses Problem zwar kenne, aber da es jedesmal speziell ist, nicht sicher sagen kann, wo die Lösung liegt.

Wahrscheinlich brauchst du nicht & amp;#x002E; sondern & #x002E; oder & amp;amp;#x002E; Jedes Lesen des XML verbraucht eine Indirektion.

Vermutlich bist du auf diese Idee schon selbst gekommen und es funktioniert trotzdem nicht. Mehr kann ich aber nicht helfen, sorry.

GruĂź

Rolf

Hallo Thomas,

wie wandelst du denn das XML fĂĽr die Ausgabe in Textform um? Hast du eine eigene Klasse oder verwendest du den Transformer aus java.xml oder etwas anderes (z.B. jdom)?

GruĂź
Stefan

Hallo

beim erzeugen und auswerten von XMLdateien sollte auf jedenfall da encoding von beiden seiten unterstĂĽtzt werden .

<?xml version="1.0" encoding="ISO-8859-1"?>

ich empfehle utf8, ich glaub die Codierung ist auch utf8 gewesen. Der eingesetzte DOMParser dĂĽrfte das dann auswerten.
Sollte man selber mit stringoperationen auf das reine xmlfile gehen, ist eine Konvertierung des Zeichensatzes erforderlich

java:

InputStreamReader isr = new InputStreamReader(fis,„UTF-8“);
StringBuffer sb = new StringBuffer();
BufferedReader br = new BufferedReader(isr);
int instr = -1;
while ((instr = br.read()) != -1) {
sb.append((char)instr);
}
return sb;

oder

try {
String xyz = new String(abcd.getBytes(„UTF-8“));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

UTF8 steht hier fĂĽr das encoding.

grĂĽĂźe
NandoK

PS: schreib mal ob es Dir geholfen hat

Moin Stefan,

danke fĂĽr Deine schnelle Antwort.

Ich verwende folgende Routine um das XML auf die Platte zu schreiben:
*******************************************
public static void writeXML(Document xmlDoc, String xmlFileName)
{
try
{
OutputFormat outFormat = new OutputFormat(xmlDoc);
outFormat.setEncoding(„UTF-8“);

outFormat.setIndenting(true);
XMLSerializer serializer = new XMLSerializer(new FileOutputStream(new File(xmlFileName)), outFormat);

serializer.serialize(xmlDoc);
}
catch (IOException e)
{
logger.error(e.toString());
logger.error(„XML-File not writeable or different error“);
System.exit(0);
}
}
*******************************************

Wenn ich die Daten ĂĽber einen Tomcat zurĂĽckliefern lasse (auch mit dem selben Problem) verwende ich eine DOMSource.
*******************************************
Element besprechungenRoot = …; // org.w3c.dom-XML mit Besprechungen

org.w3c.dom.Document domResponse = createDom();

Element responseRoot = domResponse.createElement(„InformReply“);
Element faultElem = createFaultNode(faultCode, faultString, domResponse);

responseRoot.appendChild(faultElem);

if (faultCode == 0)
{
responseRoot.appendChild(besprechungenRoot);
}
response.setNode(responseRoot);

*******************************************
Die Sonderzeichen werden von mir als Textnode (org.w3c.dom.Text) mit Strings hinzugefĂĽgt.
Im String steht & #x002E; (allerdings OHNE das Blank zwischen & und #!!!)
Im XML steht dann leider & amp;#x002E (auch wieder ohne das Blank).

Hallo,

mein Problem ist ein anderes. Ich erzeuge ja XML-Dateien aus XML-Snippets und diese Snippets enthalten Sonderzeichen die als z. B. & #x002E; (allerdings OHNE das Blank zwischen & und #!!!)
kodiert sind. Diese möchte ich 1:1 in mein XML übernehmen.
Beim Setzen funktioniert das alles lt. Log-Ausgaben noch. Da sich bei den Snippets keinerlei UTF-8-Zeichen enthalten sind, sondern nur „normale“ Zeichen, sollte das Encoding hier keine Rolle spielen.
Ich möchte ja nicht das Zeichen selbst darstellen, sondern nur seine Codierung und in meiner Zieldatei steht dann immer & amp; anstelle des reinen & vor dem restlichen Code.
Bei der Ausgabe in der Datei steht dann aber & amp;#x002E (auch wieder ohne das Blank).

Ich schreibe die Datei mittels der Methode:
*******************************************
public static void writeXML(Document xmlDoc, String xmlFileName)
{
try
{
OutputFormat outFormat = new OutputFormat(xmlDoc);
outFormat.setEncoding(„UTF-8“);

outFormat.setIndenting(true);
XMLSerializer serializer = new XMLSerializer(new FileOutputStream(new File(xmlFileName)), outFormat);

serializer.serialize(xmlDoc);
}
catch (IOException e)
{
logger.error(e.toString());
logger.error(„XML-File not writeable or different error“);
System.exit(0);
}
}
*******************************************

Moin Thomas,

die Ausgabe sieht gut aus, ich denke mal der Fehler liegt im Setzen Wertes bzw. Erzeugen des Textnodes.

Du brauchst (darfst!) dir beim Erzeugen des Text keine Gedanken um die Kodierung zu machen. Das ist wichtig, da der Serializer die Kodierung und Escaping später übernimmt.

Willst du einen Punkt zum Text hinzufügen, solltest du das einfach tun (createTextNode(".")). Der Serializer wird ihn später übersetzen, wenn es für die entsprechende Kodierung erforderlich ist - und nur dann.

Ich vermute, du erzeugst den Text mit dem bereits Kodierten Wert (createTextNode("& #x002E;")). Und genau da ist der Haken.
Der Serializer geht davon aus, dass das Text-Objekt einen unkodierten Wert enthält. Er meint, du möchstes nicht den Punkt sehen sondern eben „& #x002E;“ und kodiert ihn entsprechend, da das &-Zeichen unkodiert im Element nicht zulässig wäre.

Wenn du wirklich selbst fĂĽr die Kodierung sorgen willst (was sicher NICHT gut ist), kannst du dem Outputformat sagen, welche Nodes nicht erneut kodiert werden sollen:
outFormat.setNonEscapingElements(new String[]{„Elementname1“, „Elementname2“});
usw.

Der Serializer wird immer ein, anhand der im Outputformat angegebenen Kodierung, gültiges Dokument liefern. Punkte, viele Sonderzeichen etc. sind bei UTF-8 keine besonderen Zeichen - die werden also beim Ausgeben nicht umgeschrieben, das & schon - es ist ein Steuerzeichen und wird zu & amp; „Escaped“.

Verständlich?

Das coole ist ja, dass diese Website hier anscheindend kein Escaping der eingegebenen Sonderzeichen durchführt. Das ist nicht ungefährlich :wink:

1 Like

Ok, Deiner Antwort an Nando zufolge interessiert dich glaube ich nur diese Funktion :smile:

outFormat.setNonEscapingElements()

s.o.

Hallo

Das heisst dass es ansich schon umcodiert wird

„& amp;“ (ohne Leerzeichen) ist der Ausdruck für ein kaufmännisches Und „&“ irgendwer codiert dieses Zeichen um.

vielleicht wäre es einfach diese zeichenfolge per string replace wieder zu ersetzen

Oder aber man erzeugt eine neue Datei mit bestimmten Zeichensatz und codiert alle snippets mit dem gleichen Zeichensatz bevor man sie zusammenfĂĽhrt

grĂĽĂźe
Nando

Hallo Stefan,

heute habe ich mich wieder mit dem Thema befassen können.

Dein Tipp war goldrichtig!!!

Vielen Dank!

LG
Thomas

tatsächlich findet dort eine automatische konvertierung statt.

vielleicht hilft dir folgende klasse weiter:
http://commons.apache.org/lang/api-release/org/apach…

Hallo Daniel,

mein Problem hat sich schon durch einen vorherigen Tipp erledigt.
*********************
Re^4: Sonderzeichen in XML-Datei einbauen
an Stefan Sielaff , 30.11.2010 16:05

gab mir den Hinweis auf die Methode:
outFormat.setNonEscapingElements()
*********************
Aber danke fĂĽr die RĂĽckmeldung!
GruĂź
Thomas

tatsächlich findet dort eine automatische konvertierung statt.

vielleicht hilft dir folgende klasse weiter:
http://commons.apache.org/lang/api-release/org/apach…