Как отключить ненужное экранирование в 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