如何在 XStream 中禁用漂亮打印(空白/换行符)?
Posted
技术标签:
【中文标题】如何在 XStream 中禁用漂亮打印(空白/换行符)?【英文标题】:How to disable pretty-printing(white space/newline) in XStream? 【发布时间】:2010-10-28 00:49:55 【问题描述】:这就是我为 XML 创建 XStream 实例的方式:
XStream xstream = new XStream();
这是用于 JSON 的:
private final XStream xstream = new XStream(new JsonHierarchicalStreamDriver()
public HierarchicalStreamWriter createWriter(Writer writer)
return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);
);
它们都是漂亮的打印(缩进)输出。
如何让 XStream 禁用漂亮打印?
【问题讨论】:
如何定义自己的print Writer。 pretty-Print Writer 不能满足我的需要。我想在每个属性和元素之后换行。那该怎么做呢? ***.com/questions/8943000/… 【参考方案1】:这对我有用:
XStream stream = new XStream(new StaxDriver());
stream.toXML(messages, out);
StringWriter out = new StringWriter();
String s = out.toString();
LOG.info(s);
【讨论】:
【参考方案2】:以这种方式创建您的 XStream 实例:
XStream xstream = new XStream(new JsonHierarchicalStreamDriver()
public HierarchicalStreamWriter createWriter(Writer writer)
return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE, new JsonWriter.Format(new char[0], new char[0], 0));
);
这里是 Format 类的构造函数:
/**
* Create a new Formatter.
*
* @param lineIndenter the characters used for indenting the line
* @param newLine the characters used to create a new line
* @param mode the flags for the format modes
* @since 1.4
*/
public Format(char[] lineIndenter, char[] newLine, int mode)
this(lineIndenter, newLine, mode, new NoNameCoder());
查看JsonWriter
的源代码了解更多信息
【讨论】:
【参考方案3】:漂亮打印的默认行为来自 AbstractXmlDriver.createWriter() 方法(XStream 使用 XppDriver 作为其默认分层流驱动程序,这扩展了 AbstractXmlDriver):
public HierarchicalStreamWriter createWriter(Writer out)
return new PrettyPrintWriter(out, getNameCoder());
如果你想全局禁用漂亮打印(同时保留所有其他默认行为)并且只使用简单的 toXML(o) 方法而不是搞乱这里建议的其他每个使用选项,你可以将你的 XStream 实例初始化为跟随。这会用 CompactWriter 覆盖上述方法。
XStream xstream = new XStream(new XppDriver()
@Override
public HierarchicalStreamWriter createWriter(Writer out)
return new CompactWriter(out, getNameCoder());
);
【讨论】:
【参考方案4】:谢谢,你的帖子有帮助!!!这是我用来转换为字符串的。
String strXML = "";
XStream xs = new XStream();
StringWriter sw = new StringWriter();
xs.marshal(this, new CompactWriter(sw));
strXML = sw.toString();
【讨论】:
当 xml 节点包含下划线时,此方法不起作用 -- 它添加了一个额外的下划线 -- 例如 -- my_name 被转换为 my__name【参考方案5】:在社区的帮助下,我找到了答案。
对于 XML,您必须更改序列化方式:
行:
xStream.toXML(o, new OutputStreamWriter(stream, encoding));
改为线
xStream.marshal(o, new CompactWriter(new OutputStreamWriter(stream, encoding)));
对于 JSON,您只需更改 XStream 的创建方式。所以XStream的初始化改成:
private final XStream xstreamOut = new XStream(new JsonHierarchicalStreamDriver()
public HierarchicalStreamWriter createWriter(Writer writer)
return new JsonWriter(writer, new char[0], "", JsonWriter.DROP_ROOT_MODE);
);
请注意,使用了 4 参数的 JsonWriter 构造函数。
【讨论】:
如何定义自己的print Writer。 pretty-Print Writer 不能满足我的需要。我想在每个属性和元素之后换行。那要怎么做呢? 我们如何使用 CompactWriter 添加序言或样式表?我使用 new Writer().write 方法添加 prolog 和样式表,但是 CompactWriter 没有这个功能。【参考方案6】:使用紧凑型写入器在 xstream 上使用 marschal 方法
xstream.marshal(someObject, new CompactWriter(out));
【讨论】:
“marshal”和“toXML”有什么区别?这就是我现在使用的:xStream.toXML(o, new OutputStreamWriter(stream, encoding)); 显然 CompactWriter 仅适用于 XML。我已将命令修改为以下命令,现在我总是得到 XML,即使我需要 JSON:xStream.marshal(o, new CompactWriter(new OutputStreamWriter(stream, encoding))); 参见 JavaDoc - toXML:将对象序列化为打印精美的 XML 字符串。 - marschal:对分层数据结构(如 XML)进行序列化和对象化。因此,使用 marshal 您可以获得一些输出选项。 JSON 没有这样的选择。以上是关于如何在 XStream 中禁用漂亮打印(空白/换行符)?的主要内容,如果未能解决你的问题,请参考以下文章
在 Pandas DataFrame 中的字符串内漂亮地打印换行符
Swift:在 UITextView 中使用占位符文本禁用空白/换行符文本的栏按钮