2

我需要将一个(可能很大的)XML 文档直接发送到流中,所以我想以“SAX 样式”执行它——以流方式,当我去的时候,文档通过线路发送——而不是到“DOM 样式”——以批处理方式,其中文档构建在内存中,然后在最后通过网络发送。我确信这很容易做到,但我找不到适合我生活的好教程。提前感谢您的建议。

编辑需要明确的是,我并不特别关注要使用哪个 XML API,只要它在构建文档时通过网络发送文档,而不是在内存中构建整个文档。

4

2 回答 2

4

我倾向于使用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();
}
于 2013-04-02T02:35:28.837 回答
0

您最好的方法可能取决于您的数据的来源。它是从内存中开始的吗?您是否从外部来源(如服务或数据库)检索数据?

如果您要转换大量对象,例如来自数据库的查询,那么执行简单对象到 XML 转换的对象序列化程序(例如 Jackson)可能仍然符合您的低内存消耗目标——您只需申请它迭代地。打开您的流,读取一行,对其进行序列化,将其输出到流中,读取下一行,对其进行序列化等。您始终保持打开相同的输出流,但始终保持内存中的 XML 代码量小的。

于 2013-04-02T03:15:40.807 回答