2010-06-09 8 views
7

Ich habe die folgenden DOMWie kann ich verhindern XmlSerializer ê zu & # 234 Transformation; in einem Attribut?

<row> 
     <link href="B&#252;ro.txt" target="_blank"> 
      my link 
     </link> 
    </row> 

Wenn ich es in eine Datei serialisiert die Java XmlSerializer verwenden kommt es wie folgt aus:

<row> 
     <link href="B&amp;#252;ro.txt" target="_blank"> 
      my link 
     </link> 
    </row> 

Gibt es eine Möglichkeit, die Art und Weise zu steuern XmlSerializer Flucht Griffe Attribute? Sollte ich das irgendwie anders machen?

aktualisieren

ich auch, dass ich bin mit 1.6 jre sagen sollte. Ich hatte mit jre 1.5 bis vor kurzem gewesen, und ich bin mir ziemlich sicher, dass es serialisiert wurde ‚richtig‘ (das heißt die ‚&‘ wurde nicht entgangen)

Klärung

Das DOM ist programmatisch erstellt. Hier ein Beispiel:

 Document doc = createDocument(); 
     Element root = doc.createElement("root"); 
     doc.appendChild(root); 
     root.setAttribute("test1", "&#234;"); 
     root.setAttribute("test2", "üöä"); 
     root.appendChild(doc.createTextNode("&#234;")); 

     StringWriter sw = new StringWriter(); 

     serializeDocument(doc, sw); 
     System.out.println(sw.toString()); 

Meine Lösung ich nicht wirklich wollte, dies zu tun, weil es eine angemessene Menge an Codeänderung beteiligt und testen, aber ich beschloß, die Attributdaten in ein CDATA Element zu bewegen. Problem gelöst vermieden.

Antwort

2

Wie erhalten Sie das DOM? Könnte es etwas damit zu tun haben? Ich habe versucht, Ihr XML-Beispiel mit dem Standard-Document (nur b/c Ich bin mehr vertraut mit ihm) mit Sun Java 6 und dem neuesten Xerces-J (2.9.1), die durch die Art und Weise XmlSerializer für LSSerializer oder TrAX deprecates.

Wie auch immer, diese Technik verwendet, das serialisierte Dokument enthält nicht einmal die Zeichenreferenz mehr und wird zu „Büro.txt“ umgewandelt. Ich habe den folgenden Code:

String xml = "<row>\n" 
    + "  <link href=\"B&#252;ro.txt\" target=\"_blank\">\n" 
    + "   my link\n" + "  </link>\n" + " </row>"; 

InputStream is = new ByteArrayInputStream(xml.getBytes()); 
Document doc = DocumentBuilderFactory.newInstance() 
    .newDocumentBuilder().parse(is); 

XMLSerializer xs = new XMLSerializer(); 
xs.setOutputCharStream(new PrintWriter(System.err)); 

xs.serialize(doc); 
+0

Dank +1. Das DOM wird programmgesteuert erstellt (appendChild usw.). Ich werde der Frage eine Klarstellung hinzufügen. Habe gerade LSSerializier entdeckt, also schaue ich mir das an. – paul

+0

Okay, mal sehen. Vielleicht weiß jemand anderes eine bessere Lösung, aber ich vermute, dass es unmöglich ist (zumindest sauber), Zeichenreferenzen auf diese Weise zu erstellen, weil die Daten als solche und nicht als XML-Anweisungen behandelt werden. Könnte aber falsch sein ... Da sowohl XML als auch Java Unicode-fähig sind, ist dies möglicherweise nicht so schlimm. – musiKk

4

Das Problem ist, dass Sie das DOM mit Attributwerten erstellen, die bereits gewesen sind „entkommen“ gemäß den XML-Konventionen. Das DOM merkt natürlich nicht, dass Sie das getan haben und entkommt dem kaufmännischen Und-Zeichen.

sollten Sie

root.setAttribute("test1", "&#234;"); 

zu

root.setAttribute("test1", "\u00EA"); 

Mit anderen Worten, die aus Klar Unicode-Codepoints Verwendung Strings ändern, wenn das DOM zu konstruieren. Die XMLSerializer sollten dann Unicode-Zeichen mit Zeichenentität ersetzen erforderlich ... je nach der gewählten Zeichencodierung für das Ausgabedokument.

BEARBEITEN - Der Grund dafür, dass Sie im XML-Ausgang immer noch rohe Zeichen und keine Zeichenentitäten sehen, ist, dass XMLSerializer die Standardcodierung für XML verwendet. d.h. UTF-8. Die Art und Weise, dies zu Adresse ist den XMLSerializer(OutputFormat) Konstruktor verwenden, ein OutputFormat geben, die die erforderliche Zeichencodierung für die XML spezifiziert. (Es klingt wie Sie "ASCII" verwenden.) Achten Sie darauf, die kompatible Zeichencodierung für die OutputStream zu verwenden.

+0

+1 klingt sehr vernünftig. Wie auch immer, ich habe es versucht und das '\ u00EA' bleibt unbearbeitet. Ich setze den Attributwert in das href-Attribut eines Anker-Tags, z. paul

+0

Die \ u00EA ist ein Java-Unicode-Escape. Wenn es irgendwie in der Ausgabe in dieser Form erscheint ... Sie muss es in Eingabedaten enthalten und nicht als Java-Zeichen oder String-Literal –

+1

Verwenden von "ASCII" anstelle von "UTF8" als Codierung funktioniert nett. Danke! – Etan