maike: JDOM XMLOutputter Sonderzeichen

Hallo,

ich lese in Java mit Hilfe von JDOM ein XML-Dokument ein, verändere es und speichere es wieder ab. Dabei gibt es ein Problem mit den Sonderzeichen. In dem Original XML-Dokument verwende ich Entities, um die Zeichen abzubilden. Nachdem das Dokument später wieder abgespeichert wird, sind alle Sonderzeichen durch ein ? dargestellt.

Also habe ich eine Methode geschrieben, die vor der Ausgabe alle Sonderzeichen durch das entsprechende Entitie ersetzt.
Dabei gibt es allerdings auch Probleme. Wenn ich z.B. "ä" durch & auml; dann steht im XML-Dokument & amp;auml;
(natürlich ohne Leerzeichen, nur hier zur Darstellung...)

Die Methode output der Klasse XMLOutputter ersetzt anscheinend automatisch das & Zeichen durch & amp;
Wie kann ich das vermeiden?
Hängt das vielleicht mit dem Encoding zusammen?

Wichtig ist evtl. noch, dass das Java-Programm unter Linux läuft!!

Hier der Code:

Element rootElem = new Element("Document");
Document doc = new Document(rootElem);
....
// Elemente einfügen und Text durch Entity ersetzen
//

FileWriter out = new FileWriter(pfad);
out.write("<?xml version='1.0' encoding='ISO-8859-1' standalone='no'?\n");
out.write("<!DOCTYPE Document [\n");
out.write("<!ENTITY auml '&amp;auml;'>\n");
out.write("<!ENTITY ouml '&amp;ouml;'>\n");
out.write("<!ENTITY uuml '&amp;uuml;'>\n");
out.write("<!ENTITY Auml '&amp;Auml;'>\n");
out.write("<!ENTITY Ouml '&amp;Ouml;'>\n");
out.write("<!ENTITY Uuml '&amp;Uuml;'>\n");
out.write("<!ENTITY szlig '&amp;szlig;'>\n");
out.write("<!ENTITY amp '&amp;'>\n");
out.write("<!ENTITY lt '&amp;lt;'>\n");
out.write("<!ENTITY nbsp '&amp;nbsp;'>\n");
out.write("<!ENTITY egrave '&amp;egrave;'>\n");
out.write("<!ENTITY agrave '&amp;agrave;'>\n");
out.write("<!ENTITY eacute '&amp;eacute;'>\n");
out.write("<!ENTITY aacute '&amp;aacute;'>\n");
out.write("<!ENTITY deg '&amp;deg;'>\n");
out.write("<!ENTITY Ntilde '&amp;Ntilde;'>\n");
out.write("<!ENTITY sup2 '&amp;sup2;'>\n");
out.write("]>\n");

XMLOutputter xmlOut = new XMLOutputter();
xmlOut.setOmitDeclaration(true);
xmlOut.setOmitEncoding(true);
xmlOut.output(doc, out);
out.close();

Hoffe mir kann jemand helfen,

Danke,
Gruß Maike

  1. Hallo maike,

    In XML gibt es ja nur benannte Entities für < > ' " &
    Alle anderen Zeichen musst Du entweder direkt ins Dokument schreiben (richtigen Zeichensatz angeben) oder Du verwendest Zeichenreferenzen.
    &#xFF;

    Was willst Du eigentlich hiermit erreichen?
    <!ENTITY auml '&amp;auml;'>
    Damit erreichst Du, dass &auml; im Dokumentinhalt durch &auml; ersetzt wird. So eine endlos rekursive Definition dürfte kaum Zulässig sein.

    Die notwendigen Ersetzungen nimmt der XMLOutputter ja offensichtlich schon vor, allerdings gibt standardmäßig er utf-8 aus.
    Du musst dem XMLOutputter bei der Instanzierung ein Format-Objekt (http://www.jdom.org/docs/apidocs/index.html) übergeben, dass iso-8859-1 als Encoding festlegt, damit der XMLOutputter alle Zeichen, die nicht in diesem Zeichensatz sind, durch entsprechende Zeichenreferenzen ersetzen kann.
    Außerdem musst Du für den FileWriter ebenfalls iso-8859-1 als Zeichensatz festlegen, damit die Zeichen richtig codiert werden.
    Statt dem FileWriter könntest Du natürlich auch einen FileOutputStream verwenden und XML-Deklaration und Doctype vom XMLOutputter erzeugen lassen.

    Grüße

    Daniel