JAXB: вывод XML-маршала с отступом создает пустой разрыв строки на первой строке

Когда я маршалирую 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?

Ответ 1

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

Вариант № 1

Один вариант - использовать java.io.FilterWriter или java.io.FilterOutputStream и настроить его для игнорирования ведущей новой строки.

Вариант № 2

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

Ответ 2

Поскольку я сортировал объект 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);
}