【问题标题】:How to disable pretty-printing(white space/newline) in XStream?如何在 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 禁用漂亮打印?

【问题讨论】:

标签: java xml json xstream


【解决方案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 没有这样的选择。
        猜你喜欢
        • 2013-02-07
        • 1970-01-01
        • 2016-06-18
        • 1970-01-01
        • 1970-01-01
        • 2019-12-11
        • 1970-01-01
        • 2015-04-05
        • 2016-03-23
        相关资源
        最近更新 更多