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);

ссылка