【问题标题】:How to format a String onto one line, StringUtils?如何将字符串格式化为一行,StringUtils?
【发布时间】:2010-07-16 15:15:28
【问题描述】:

我有一个字符串,我将其传递给 log4j 以将其记录到文件中,该字符串的内容是 XML,并且它被格式化为带有缩进等的多行,以便于阅读。

但是,我希望 XML 都在一条线上,我该怎么做呢?我看过StringUtils,我想我可以去掉制表符和回车,但一定有更干净的方法吗?

谢谢

【问题讨论】:

  • 性能是否至关重要?从字符串中删除一些字符可以很快完成;解析 XML 然后再次序列化它可能会非常昂贵。
  • @extraneon:我回答的时候不会考虑这个...
  • @Sylvain M 你不应该 :) 但对于詹姆斯来说,这可能是需要考虑的事情。如果生成的日志像if (logger.isDebugEnabled()) { /* log */} 一样,也不是问题

标签: java xml string log4j


【解决方案1】:

我会对其进行正则表达式替换。这效率不高,但肯定比 XML 解析更快!

这是未经测试的:

 String cleaned = original.replaceAll("\\s*[\\r\\n]+\\s*", "").trim();

如果我没有弄错,那将消除所有行终止符以及紧跟在这些行终止符之后的任何空格。模式开头的空格应该消除单行上的任何尾随空格。 trim() 被投入使用以消除第一行开头和最后一行结尾处的空白。

【讨论】:

  • 你可以使用[\r\n],这里不需要双斜线。
  • @polyg 你不需要双精度因为你希望得到的正则表达式是\r,并且你需要转义Java字符串中的`\`?
  • 据我了解,您可以将 \ 加倍以让正则表达式扫描器对其进行评估,或者将其保留为单个,以便 Java 语言将 \r 视为 CR 并逐字插入括号中.
  • 做了 傻瓜!第二个\s 之后是+,这意味着不会消除下一行中没有 前导空格的行终止符。我已将其更改为 *
  • String cleaned = original.replaceAll("\\s*\\R+\\s*", "").trim();
【解决方案2】:

也许与 JDom http://www.jdom.org/

public static Document createFromString(final String xml) {
    try {
        return new SAXBuilder().build(new ByteArrayInputStream(xml.getBytes("UTF-8")));
    } catch (JDOMException e) {
        throw new RuntimeException(e);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

public static String renderRaw(final Document description) {
    return renderDocument(description, getRawFormat());
}

public static String renderDocument(final Document description, final Format format) {
    return new XMLOutputter(format).outputString(description);
}

【讨论】:

  • getCompactFormat(),更有可能
  • 仅仅产生一条日志消息不是相当昂贵吗?它还需要 XML 有效才能被记录。并不是说这个解决方案不优雅,而是它确实有一些可能很重要也可能不重要的缺点。
  • 我很想知道什么是“不优雅”?
  • 他不是那样说/意思的 :) 注意句子前面的 "Not"
  • extraneon 提出了一个关于记录无效 XML 的好点,您可以说明无效 xml 需要比有效记录更多的记录!
【解决方案3】:
String oneline(String multiline) {
    String[] lines = multiline.split(System.getProperty("line.separator"));
    StringBuilder builder = new StringBuilder();
    builder.ensureCapacity(multiline.length()); // prevent resizing
    for(String line : lines) builder.append(line);
    return builder.toString();
}

【讨论】:

    猜你喜欢
    • 2017-07-14
    • 2015-03-26
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    相关资源
    最近更新 更多