2010-05-23 9 views

risposta

7

Questo è il risultato del valore predefinito di PrettyPrintWriter. Personalmente, mi piace sfuggire sia a < che a>. Rende l'output più equilibrato.

Se si desidera l'output XML canonizzato, è necessario utilizzare l'API C14N fornita in Java.

Se il contenuto in streaming include XML, CDATA è un'opzione migliore. Ecco come ho fatto,

XStream xstream = new XStream(
      new DomDriver() { 
       public HierarchicalStreamWriter createWriter(Writer out) { 
        return new MyWriter(out);}}); 
String xml = xstream.toXML(myObj); 

    ...... 

public class MyWriter extends PrettyPrintWriter { 
    public MyWriter(Writer writer) { 
     super(writer); 
    } 

    protected void writeText(QuickWriter writer, String text) { 
     if (text.indexOf('<') < 0) { 
      writer.write(text); 
     } 
     else { 
      writer.write("<[CDATA["); writer.write(text); writer.write("]]>"); 
     } 
    } 
} 
+0

Una sezione CDATA non è un'alternativa completa all'escaping, poiché la sequenza ']]>' non può esserci dentro. (A volte viene sfuggito a due sezioni CDATA.) – bobince

+0

Nota che questo comportamento disattiva l'escape globale per il tuo oggetto XStream. Se si desidera disabilitare l'escape quando il testo contiene '<' o altri caratteri specifici, è possibile sostituire 'writer.write (testo);' con 'super.write (writer, text);', ripristinando in tal modo il comportamento di escape predefinito per tutti gli altri casi. –

0

XStream non scrive XML da solo, utilizza varie librerie ("driver"?) Per farlo.

Basta scegliere uno che non lo fa. L'elenco è sul loro sito. Immagino che utilizzerebbe XOM per impostazione predefinita.

1

CDATA non ha funzionato per me, Infine devo lavorare con Apache StringUtils.

StringUtils.replaceEach(xml, new String[]{"&lt;","&quot;","&apos;","&gt;"}, new String[]{"<","\"","'",">"}); 
Problemi correlati