如何在 XStream 中禁用不必要的转义?

Posted

技术标签:

【中文标题】如何在 XStream 中禁用不必要的转义?【英文标题】:How can I disable unnecessary escaping in XStream? 【发布时间】:2011-02-22 21:27:43 【问题描述】:

默认情况下 XStream 会不必要地转义 >," ... 等。

有没有办法禁用它(并且只能转义<&)?

【问题讨论】:

【参考方案1】:

XStream 不会自己编写 XML,它使用各种库(“驱动程序”?)来编写。

只需选择一个没有的。该列表在他们的网站上。我猜它会默认使用 XOM。

【讨论】:

【参考方案2】:

这是默认 PrettyPrintWriter 的结果。就个人而言,我喜欢同时逃避 。它使输出看起来更平衡。

如果您想要规范化的 XML 输出,您应该使用 Java 中提供的 C14N API。

如果流内容包括 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("]]>"); 
        
    

【讨论】:

CDATA 部分不是转义的完整替代方案,因为序列]]&gt; 不能进入其中。 (有时会转义为两个 CDATA 部分。) 请注意,此行为会关闭您的 XStream 对象的全局转义。如果您只想在文本包含“writer.write(text); 替换为super.write(writer, text);,从而恢复所有其他情况的默认转义行为。 构造CDATA部分的代码也应该包含一个感叹号,如writer.write("&lt;![CDATA[");【参考方案3】:

Cdata 对我不起作用, 最后我必须使用 Apache StringUtils。

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

【讨论】:

以上是关于如何在 XStream 中禁用不必要的转义?的主要内容,如果未能解决你的问题,请参考以下文章

XStream:如何在编组的 XML 中隐藏 2 个不必要的父节点?

如何全局禁用 Django 模板的自动转义?

如何在 iOS 字符串中禁用或绕过 Base64 图像 url 数据的转义序列

在 Inventor 中禁用转义键

在 Django 的 TextField 中禁用 HTML 转义

如何转义液体模板标签?