如何将列表写入 xml 而不是在内存中填充列表

How to write list to xml not populating list in memory

我有这样的结构

class Header{

List<Item> items
}

Header 和 Item 都有 xsd 架构。我需要将其中包含项目的 Header 写入 xml 文件,而无需在内存中填充列表,因为最多可能有 10000 个元素。 我无法执行 marshaller.marshal(header) 之类的操作,因为项目未填充。我看到以下解决方案:使用 marshaller 将每个项目映射到 xml 字符串并将其逐项写入文件。在从 pojo 手动创建 header 并手动关闭它之前。

Header doc=header data withoutitems
int counter=0;

//call it 10000 times
void writeItem(Item item){
if(counter==0){
FileWriter writer=new FileWriter(path);
String header1 = convertToXmlString(doc.getHeader1());
String header2 = convertToXmlString(doc.getHeader2());
writer.write("<?xml bla>")
writer.write("<myroot>")
writer.write(header1)
writer.write(header2)
}

writer.write(jaxbMarshaler.marshal(item));
counter++

if(counter==10000){
   writer.write("</myroot>")
}
}

有没有更优雅的方案?我不能(不想)使用普通的 Stax,因为 Item 结构非常庞大且困难,并且迭代每个元素都有些矫枉过正。 同样在我的解决方案中,如何同步名称空间以便 header 和所有项目都具有相同的前缀?

参考JAXB Fragmented Marshalling

您基本上将 XMLStreamWriter 与 JAXB 片段组合在一起。