如何在 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 部分不是转义的完整替代方案,因为序列]]>
不能进入其中。 (有时会转义为两个 CDATA 部分。)
请注意,此行为会关闭您的 XStream 对象的全局转义。如果您只想在文本包含“writer.write(text); 替换为super.write(writer, text);
,从而恢复所有其他情况的默认转义行为。
构造CDATA部分的代码也应该包含一个感叹号,如writer.write("<![CDATA[");
【参考方案3】:
Cdata 对我不起作用, 最后我必须使用 Apache StringUtils。
StringUtils.replaceEach(xml, new String[]"<",""","'",">", new String[]"<","\"","'",">");
【讨论】:
以上是关于如何在 XStream 中禁用不必要的转义?的主要内容,如果未能解决你的问题,请参考以下文章
XStream:如何在编组的 XML 中隐藏 2 个不必要的父节点?
如何在 iOS 字符串中禁用或绕过 Base64 图像 url 数据的转义序列