Скажем, я хочу вывести огромный набор результатов поиска в виде XML в PrintWriter или OutputStream, используя XOM . Полученный XML будет выглядеть так:
<?xml version="1.0" encoding="UTF-8"?>
<resultset>
<result>
[child elements and data]
</result>
...
...
[1000s of result elements more]
</resultset>
Поскольку результирующий XML-документ может быть большого размера (возможно, сотни мегабайт), я хочу вывести его в потоковом режиме (вместо создания всего документа в памяти и последующей записи).
Степень детализации вывода одного <result>
за один раз, поэтому я хочу сгенерировать один <result>
за другим и записать его в поток. Другими словами, я просто хотел бы сделать что-то вроде этого псевдокода (автоматическая очистка включена, так что не беспокойтесь об этом):
open stream/writer
write declaration
write start tag for <resultset>
while more results:
write next <result> element
write end tag for <resultset>
close stream/writer
Я смотрел на Serializer
, но необходимые методы writeStartTag(Element)
, writeEndTag(Element)
, write(DocType)
защищены, а не общедоступны! Нет ли другого способа, кроме как создать подкласс Serializer, чтобы иметь возможность использовать эти методы, или вручную записать начальный и конечный теги непосредственно в поток как строки, минуя XOM вообще? (Последнее не было бы слишком плохо в этом простом примере, но в общем случае это было бы довольно уродливо.)
Я что-то упустил или XOM просто не предназначен для этого?
С dom4j Я мог бы легко это сделать, используя XMLWriter
- у него есть конструкторы, которые принимают Writer
или OutputStream
, и методы writeOpen(Element)
, writeClose(Element)
, writeDocType(DocumentType)
и т. Д. Сравните с XOM Serializer
, где единственный публичный write
метод - это тот, который занимает целое Document
.
(Это связано с моим вопросом о лучшей замене dom4j , где XOM является сильным соперником.)