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

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

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

【问题讨论】:

    标签: java xml 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[]{"<","\"","'",">"});
      

      【讨论】:

        猜你喜欢
        • 2018-04-26
        • 2014-01-03
        • 2010-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-17
        • 1970-01-01
        • 2019-07-09
        相关资源
        最近更新 更多