Java: преобразовать отформатированный XML-файл в одну строку - PullRequest
20 голосов
/ 01 апреля 2011

У меня есть отформатированный 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>

Заранее спасибо.

Ответы [ 10 ]

43 голосов
/ 01 апреля 2011
//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

7 голосов
/ 01 апреля 2011

Запустите его через 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>

Он удалит все несущественные пробелы и выдаст ожидаемый результат, который вы опубликовали.

6 голосов
/ 01 апреля 2011
// 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)

4 голосов
/ 01 апреля 2011

Откройте и прочитайте файл.

Reader r = new BufferedReader(filename);
String ret = "";
while((String s = r.nextLine()!=null)) 
{
  ret+=s;
}
return ret;
2 голосов
/ 01 апреля 2011

Используя этот ответ, предоставляющий код для использования 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();
}
1 голос
/ 21 июля 2017

В Java 1.8 и выше

BufferedReader br = new BufferedReader(new FileReader(filePath));
String content = br.lines().collect(Collectors.joining("\n"));
1 голос
/ 02 августа 2016

Приведенные выше решения работают, если вы сжимаете все пустое пространство в документе XML.Другими быстрыми вариантами являются JDOM (используя Format.getCompactFormat ()) и dom4j (используя OutputFormat.createCompactFormat ()) при выводе документа XML.

Однако у меня было уникальное требование сохранить пустое пространство, содержащееся в текстовом значении элемента, и эти решения не работали так, как мне нужно.Все, что мне было нужно, это удалить форматирование pretty-print, добавленное в XML-документ.

Решение, которое я нашел, может быть объяснено в следующем процессе 3-step / regex ... радипонимания алгоритма решения.

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 - это строка замены, которая является первой группой захвата.

Это просто удалит пробелы, используемые при добавлении формата pretty-print в XML-документ, но сохранит все остальные пробелы, когда они являются частью текстового значения элемента.

1 голос
/ 01 апреля 2011

Полагаю, вы хотите прочитать, игнорировать пробел и снова записать его.Большинство пакетов XML имеют возможность игнорировать пробелы.Например, DocumentBuilderFactory имеет setIgnoringElementContentWhitespace для этой цели.

Аналогично, если вы генерируете XML путем маршалинга объекта, тогда JAXB имеет JAXB_FORMATTED_OUTPUT

0 голосов
/ 30 сентября 2018

Библиотека Underscore-java имеет статический метод U.formatXml (xmlstring).Я поддерживаю проект. Живой пример

import com.github.underscore.lodash.U;
import com.github.underscore.lodash.Xml;

public class MyClass {
    public static void main(String[] args) {
        System.out.println(U.formatXml("<a>\n  <b></b>\n  <b></b>\n</a>",
        Xml.XmlStringBuilder.Step.COMPACT));
    }
}

// output: <a><b></b><b></b></a>
0 голосов
/ 27 августа 2013
FileUtils.readFileToString(fileName);

ссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...