JAXB: Маршал выводит XML с отступом, создает пустой разрыв строки в первой строке - PullRequest
10 голосов
/ 06 марта 2012

Когда я собираю XML с этим атрибутом

marshal.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

, он генерирует пустой разрыв строки в самом верху

//Generate empty line break here    
<XX>
    <YY>
        <PDF>pdf name</PDF>
        <ZIP>zip name</ZIP>
        <RECEIVED_DT>received date time</RECEIVED_DT>
    </YY>
</XX>

Я думаю, причина в том, что marshal.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);,которые удаляют <?xml version="1.0" encoding="UTF-8" standalone="yes"?>, оставьте выходной xml разрыв строки в начале.Есть ли способ это исправить?Я использую JAXB с JDK 6, страдает ли Moxy от этой проблемы?

Ответы [ 3 ]

2 голосов
/ 07 марта 2012

Как вы указали EclipseLink JAXB (MOXy) не имеет этой проблемы, поэтому вы можете использовать это (я веду MOXy):

Вариант № 1

Один из вариантов - использовать java.io.FilterWriter или java.io.FilterOutputStream и настроить его таким образом, чтобы игнорировать начальную новую строку.

Опция № 2

Другой вариант - выполнить маршализацию в StAX и использовать реализацию StAX, которая поддерживает форматирование вывода. Я сам не пробовал, но ответ, приведенный ниже, предлагает использовать com.sun.xml.txw2.output.IndentingXMLStreamWriter.

0 голосов
/ 07 апреля 2019

Вдохновленный первым параметром комментария bdoughan в этом посте, я написал собственный писатель для удаления пустой строки в файле XML следующим образом:

public class XmlWriter extends FileWriter {

    public XmlWriter(File file) throws IOException {
        super(file);
    }

    public void write(String str) throws IOException {
        if(org.apache.commons.lang3.StringUtils.isNotBlank(str)) {
            super.write(str);
        }
    }
}

Для проверкипустая строка, я использовал org.apache.commons.lang3.StringUtils.isNotBlank() метод, вы можете использовать свое собственное пользовательское условие.

Затем используйте этот писатель для маршалинга метода, как показано ниже в Java 8.

// skip other code
File file = new File("test.xml");
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
try (FileWriter writer = new XmlWriter(file)) {
    marshaller.marshal(object, writer);
}

Он удалит тег <?xml version="1.0" encoding="UTF-8" standalone="yes"?>, а также не напечатает пустую строку.

0 голосов
/ 02 июля 2016

Поскольку я выполнял маршалинг для объекта File, я решил впоследствии удалить эту строку:

public static void removeEmptyLines(File file) throws IOException {
    long fileTimestamp = file.lastModified();
    List<String> lines = Files.readAllLines(file.toPath());
    try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8))) {
        for (String line : lines) {
            if (!line.trim().isEmpty()) {
                writer.write(line + "\n");
            }
        }
    }
    file.setLastModified(fileTimestamp);
}
...