我需要将一个(可能很大的)XML 文档直接发送到流中,所以我想以“SAX 样式”执行它——以流方式,当我去的时候,文档通过线路发送——而不是到“DOM 样式”——以批处理方式,其中文档构建在内存中,然后在最后通过网络发送。我确信这很容易做到,但我找不到适合我生活的好教程。提前感谢您的建议。
编辑需要明确的是,我并不特别关注要使用哪个 XML API,只要它在构建文档时通过网络发送文档,而不是在内存中构建整个文档。
我倾向于使用StAX而不是 SAX 来生成 XML - 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();
}
您最好的方法可能取决于您的数据的来源。它是从内存中开始的吗?您是否从外部来源(如服务或数据库)检索数据?
如果您要转换大量对象,例如来自数据库的查询,那么执行简单对象到 XML 转换的对象序列化程序(例如 Jackson)可能仍然符合您的低内存消耗目标——您只需申请它迭代地。打开您的流,读取一行,对其进行序列化,将其输出到流中,读取下一行,对其进行序列化等。您始终保持打开相同的输出流,但始终保持内存中的 XML 代码量小的。