Как мога да деактивирам ненужното екраниране в XStream?

XStream по подразбиране ненужно избягва >," ... и т.н.

Има ли начин да деактивирате това (и да избягате само <, &)?


person mike g    schedule 23.05.2010    source източник


Отговори (3)


Това е резултатът от PrettyPrintWriter по подразбиране. Лично аз обичам да бягам и от ‹, и от >. Това прави резултата да изглежда по-балансиран.

Ако искате канонизиран XML изход, трябва да използвате C14N API, предоставен в Java.

Ако предаваното съдържание включва XML, CDATA е по-добра опция. Ето как го направих,

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("]]>"); 
        }
    }
}
person ZZ Coder    schedule 23.05.2010
comment
Секцията CDATA не е пълна алтернатива на екранирането, тъй като последователността ]]> не може да влезе в нея. (Понякога е избягал в два CDATA раздела.) - person bobince; 24.05.2010
comment
Имайте предвид, че това поведение изключва екранирането глобално за вашия XStream обект. Ако искате да деактивирате екранирането само когато текстът съдържа '‹' или други специфични знаци, можете да замените writer.write(text); с super.write(writer, text);, като по този начин възстановите поведението на екраниране по подразбиране за всички останали случаи. - person John Rix; 19.03.2015
comment
Кодът, който конструира секцията CDATA, трябва също да съдържа удивителен знак, както в writer.write("<![CDATA["); - person Simon White; 08.08.2018

Cdata не работи за мен, накрая трябва да работя с Apache StringUtils.

StringUtils.replaceEach(xml, new String[]{"&lt;","&quot;","&apos;","&gt;"}, new String[]{"<","\"","'",">"});
person Kumar Abhishek    schedule 29.03.2016

XStream не пише XML сам, той използва различни библиотеки ("драйвери"?), за да го направи.

Просто изберете такъв, който не го прави. Списъкът е на сайта им. Предполагам, че ще използва XOM по подразбиране.

person alamar    schedule 23.05.2010