2010-07-16 4 views
4

У меня есть строка, которую я передаю log4j, чтобы она записывалась в файл, содержимое этой строки - это XML, и оно отформатировано на несколько строк с углублениями и т. Д., Чтобы было легко читать ,Как форматировать строку на одну строку, StringUtils?

Однако, я хотел бы, чтобы XML был на одной линии, как я могу это сделать? Я взглянул на StringUtils, я думаю, я мог бы удалить вкладки и возврат каретки, но должен быть более чистый способ?

Благодаря

+1

Является ли производительность критическим? Удаление некоторых символов из строки может быть выполнено довольно быстро; разбор XML и последующее его сериализация могут быть довольно дорогими. – extraneon

+0

@extraneon: Я не думаю об этом, когда я отвечаю ... –

+1

@Sylvain M Вы не должны :) Но для Джеймса это может быть чем-то, что нужно учитывать. Это также не должно быть проблемой, если журнал создается как 'if (logger.isDebugEnabled()) {/ * log * /}' – extraneon

ответ

5

Я бы бросить регулярное выражение заменить на нем. Это не очень эффективно, но обязательно будет быстрее, чем разбор XML!

Это непроверенное:

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

Если я не goofed, что позволит устранить все терминаторы линии, а также любые пробела сразу после этих терминаторов линии. Пробел в начале шаблона должен убивать любые конечные пробелы на отдельных строках. trim() забрасывается для хорошей меры, чтобы устранить пробелы в начале первой строки и в конце последнего.

+1

Вы можете просто использовать '[\ r \ n]', нет необходимости в doubleleslash. – polygenelubricants

+0

@polyg вам не нужен двойной, потому что вы хотите, чтобы результирующее выражение было '\ r', и вам нужно избежать' \\ 'в строке Java? – corsiKa

+0

@glowcoder: результирующее выражение не должно _HAVE_ быть '\ r'; это может быть только реальный неэкранированный персонаж. – polygenelubricants

1

Возможно, с 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); 
} 
+0

'getCompactFormat()', более вероятно – skaffman

+2

Разве это не так дорого для производства сообщение журнала? И это также потребовало бы, чтобы XML был действительным для его регистрации. Не то, чтобы решение не изящно, но оно имеет некоторые недостатки, которые могут быть или не быть важными. – extraneon

+0

Я заблуждаюсь, зная, что «не изящно»? –

0
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(); 
}