当我使用此属性编组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);
的{{1}}会使输出xml在开头留下换行符。有没有办法来解决这个问题?我使用JAXB附带JDK 6,Moxy会遇到这个问题吗?
答案 0 :(得分:2)
当你指出EclipseLink JAXB (MOXy)没有这个问题所以你可以使用它(我是MOXy领导):
选项#1
一种选择是使用java.io.FilterWriter
或java.io.FilterOutputStream
并自定义它以忽略前导新行。
选项#2
另一种选择是封送到StAX,并使用支持格式化输出的StAX实现。我自己没试过,但下面的答案建议使用com.sun.xml.txw2.output.IndentingXMLStreamWriter
。
答案 1 :(得分:0)
由于我正在编组一个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);
}
答案 2 :(得分:0)
受本文中bdoughan's comment的第一个选项的启发,我编写了一个自定义编写器来删除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"?>
标签,也不会打印空白行。