我需要将一个(可能很大的)XML文档直接发送到流中,所以我想以流式方式“SAX样式” - 当我去的时候通过网络发送文档 - - 与“DOM风格”相反 - 以批量方式,文档在内存中构建,然后在最后通过线路发送。我确信这很容易做到,但是我找不到一本关于我生活的好教程。提前感谢您的建议。
编辑为了清楚起见,我并不特别关注使用哪种XML API,只要它在构建时通过网络发出文档而不是在内存中构建整个文档。
答案 0 :(得分:4)
我倾向于使用StAX来生成XML而不是SAX - API更易于使用。 XML是流式传输的,不会保存在内存中。
示例:
XMLStreamWriter w = XMLOutputFactory.newInstance().createXMLStreamWriter(System.out);
try
{
w.writeStartDocument();
w.writeStartElement("root");
for (int i = 0; i < 1000; i++)
{
w.writeStartElement("number");
w.writeCharacters(String.valueOf(i));
w.writeEndElement(); //number
}
w.writeEndElement(); //root
w.writeEndDocument();
}
finally
{
w.close();
}
答案 1 :(得分:0)
您最好的方法可能取决于您的数据来源。它是从内存开始的吗?您是从服务或数据库等外部源检索数据吗?
如果你正在转换一个大的对象列表,比如来自数据库的查询,那么对象序列化器(例如Jackson)可以完成简单的XML转换对象,这可能仍然符合你的低内存消耗目标 - 你只是迭代地应用它。打开你的流,读取一行,序列化它,输出到流,读取下一行,序列化它等。你保持相同的输出流打开整个时间,但生活在内存中的XML代码的数量总是保持不变小。