Java: преобразовать форматированный XML файл в одну строку строки
У меня есть форматированный XML файл, и я хочу преобразовать его в одну строку строки, как я могу это сделать.
Пример xml:
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<title>Basic XML</title>
<price>100</price>
<qty>5</qty>
</book>
<book>
<title>Basic Java</title>
<price>200</price>
<qty>15</qty>
</book>
</books>
Ожидаемый результат
<?xml version="1.0" encoding="UTF-8"?><books><book> <title>Basic XML</title><price>100</price><qty>5</qty></book><book><title>Basic Java</title><price>200</price><qty>15</qty></book></books>
Спасибо заранее.
Ответы
Ответ 1
//filename is filepath string
BufferedReader br = new BufferedReader(new FileReader(new File(filename)));
String line;
StringBuilder sb = new StringBuilder();
while((line=br.readLine())!= null){
sb.append(line.trim());
}
Использование StringBuilder более эффективно, чем concat http://kaioa.com/node/59
Ответ 2
// 1. Read xml from file to StringBuilder (StringBuffer)
// 2. call s = stringBuffer.toString()
// 3. remove all "\n" and "\t":
s.replaceAll("\n","");
s.replaceAll("\t","");
отредактирован:
Я допустил небольшую ошибку, лучше использовать StringBuilder в вашем случае (я полагаю, вам не нужен потокобезопасный StringBuffer)
Ответ 3
Запустите его через XSLT- преобразование с помощью <xsl:output indent="no">
и <xsl:strip-space elements="*"/>
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="no" />
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Он удалит все незначительные пробелы и даст ожидаемый результат, который вы опубликовали.
Ответ 4
Откройте и прочитайте файл.
Reader r = new BufferedReader(filename);
String ret = "";
while((String s = r.nextLine()!=null))
{
ret+=s;
}
return ret;
Ответ 5
Используя этот ответ, который предоставляет код для использования Dom4j для печати довольно-таки, измените строку, которая устанавливает выходной формат: createPrettyPrint()
в: createCompactFormat()
public String unPrettyPrint(final String xml){
if (StringUtils.isBlank(xml)) {
throw new RuntimeException("xml was null or blank in unPrettyPrint()");
}
final StringWriter sw;
try {
final OutputFormat format = OutputFormat.createCompactFormat();
final org.dom4j.Document document = DocumentHelper.parseText(xml);
sw = new StringWriter();
final XMLWriter writer = new XMLWriter(sw, format);
writer.write(document);
}
catch (Exception e) {
throw new RuntimeException("Error un-pretty printing xml:\n" + xml, e);
}
return sw.toString();
}
Ответ 6
Я думаю, вы хотите прочитать, проигнорировать пустое пространство и записать его снова. Большинство пакетов XML имеют возможность игнорировать пробелы. Например, DocumentBuilderFactory имеет setIgnoringElementContentWhitespace для этой цели.
Аналогично, если вы генерируете XML путем маршалинга объекта, тогда JAXB имеет JAXB_FORMATTED_OUTPUT
Ответ 7
Вышеупомянутые решения работают, если вы сжимаете все пробелы в документе XML. Другими быстрыми параметрами являются JDOM (используя Format.getCompactFormat()) и dom4j (используя OutputFormat.createCompactFormat()) при выводе XML-документа.
Однако у меня было уникальное требование сохранить пустое пространство, содержащееся в текстовом значении элемента, и эти решения не работали так, как мне было нужно. Все, что мне было нужно, это удалить форматирование "довольно-печатного", добавленное в документ XML.
Решение, которое я придумал, можно объяснить в следующем трехэтапном/регулярном процессе... для понимания алгоритма решения.
String regex, updatedXml;
// 1. remove all white space preceding a begin element tag:
regex = "[\\n\\s]+(\\<[^/])";
updatedXml = originalXmlStr.replaceAll( regex, "$1" );
// 2. remove all white space following an end element tag:
regex = "(\\</[a-zA-Z0-9-_\\.:]+\\>)[\\s]+";
updatedXml = updatedXml.replaceAll( regex, "$1" );
// 3. remove all white space following an empty element tag
// (<some-element xmlns:attr1="some-value".... />):
regex = "(/\\>)[\\s]+";
updatedXml = updatedXml.replaceAll( regex, "$1" );
ПРИМЕЧАНИЕ. Псевдокод находится в Java... "$ 1" - это строка замены, которая является первой группой захвата.
Это просто удалит пустое пространство, используемое при добавлении формата "довольно-печатать" в документ XML, но сохранит все остальные пробелы, когда оно станет частью текстового значения элемента.
Ответ 8
В java 1.8 и выше
BufferedReader br = new BufferedReader(new FileReader(filePath));
String content = br.lines().collect(Collectors.joining("\n"));
Ответ 9
Библиотека Underscore-java имеет статический метод U.formatXml(xmlstring). Я поддерживаю проект. Живой пример
import com.github.underscore.lodash.U;
import com.github.underscore.lodash.Xml;
U.formatXml("<a>\n <b></b>\n <b></b>\n</a>", Xml.XmlStringBuilder.Step.COMPACT));
// output: <a><b></b><b></b></a>
Ответ 10
FileUtils.readFileToString(fileName);
ссылка