如何在 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 中使用占位符文本禁用空白/换行符文本的栏按钮

Python如何在包含' n'的行中打印带有换行符的文本

在更漂亮的情况下禁用 printWidth

当使用 Spring MVC for REST 时,如何让 Jackson 漂亮地打印呈现的 JSON?

如何在 emacs-term 中禁用自动换行?