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 „Gefällt mir“

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…