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