11

当我用这个属性编组一个 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 的开头留下一个换行符。有没有办法解决这个问题?我使用 JDK 6 附带的 JAXB,Moxy 会遇到这个问题吗?

4

3 回答 3

2

正如您所指出的EclipseLink JAXB (MOXy)没有这个问题,所以您可以使用它(我是 MOXy 负责人):

选项1

一种选择是使用java.io.FilterWriterorjava.io.FilterOutputStream并对其进行自定义以忽略前导的新行。

选项 #2

另一种选择是编组到 StAX,并使用支持格式化输出的 StAX 实现。我自己没有尝试过,但下面链接的答案建议使用com.sun.xml.txw2.output.IndentingXMLStreamWriter.

于 2012-03-07T14:26:33.740 回答
1

受本文中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"?>标签,也不会打印空行。

于 2019-04-07T07:21:35.440 回答
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);
}
于 2016-07-02T14:54:01.533 回答