如何将列表写入 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 片段组合在一起。
我有这样的结构
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 片段组合在一起。