假设我希望使用PrintWriter或OutputStream将大量搜索结果(如XML )输出到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)都是受保护的,而不是公共的!是否只有子类序列化程序才能使用这些方法,或者手动将开始和结束标记直接作为String写入流,从而完全绕过XOM?(在这个简单的例子中,后者不会太糟糕,但在一般情况下,它会变得非常丑陋。)
,我是不是遗漏了什么,还是XOM不是为这个而做的?
使用dom4j,我可以很容易地使用XMLWriter --它有接受Writer或OutputStream的构造函数,以及方法writeOpen(Element)、writeClose(Element)、writeDocType(DocumentType)等。与XOM的Serializer相比,唯一的公共write方法是整个Document的方法。
(这与关于最佳dom4j替代品的问题有关,XOM是一个强有力的竞争者。)
发布于 2009-09-25 22:53:20
我谈到了同样的问题,但发现执行您提到的选项和子类序列化程序非常简单,如下所示:
public class StreamSerializer extends Serializer {
public StreamSerializer(OutputStream out) {
super(out);
}
@Override
public void write(Element element) throws IOException {
super.write(element);
}
@Override
public void writeXMLDeclaration() throws IOException {
super.writeXMLDeclaration();
}
@Override
public void writeEndTag(Element element) throws IOException {
super.writeEndTag(element);
}
@Override
public void writeStartTag(Element element) throws IOException {
super.writeStartTag(element);
}
}然后,您仍然可以利用各种XOM配置(如setIdent等),但是可以这样使用它:
Element rootElement = new Element("resultset");
StreamSerializer serializer = new StreamSerializer(out);
serializer.setIndent(4);
serializer.writeXMLDeclaration();
serializer.writeStartTag(rootElement);
while(hasNextElement()) {
serializer.write(nextElement());
}
serializer.writeEndTag(rootElement);
serializer.flush();发布于 2009-06-09 06:16:56
据我所知,XOM不支持直接流。
当我想要流我的XML文档时,我使用的是努克斯,它具有流式XML序列化程序,类似于XOM中的标准序列化器类。NUX与XOM兼容。我下载了NUX源代码,提取了几个NUX类(StreamingSerializer接口,StreamingXMLSerializer --它适用于XOM文档、StreamingVerifier和NamespacesInScope),将它们放入我的项目中,它的工作就像一种魅力。可惜这不是直接在XOM中:-(
NUX是XOM:http://acs.lbl.gov/software/nux/的很好的伙伴,工作镜像下载:nux-1.6.tar.gz
指向API:http://acs.lbl.gov/software/nux/api/nux/xom/io/StreamingSerializer.html的链接
下面是示例代码(按顺序调用方法:start()、n*nextResult()、finish()、序列化程序是来自NUX的StreamingXMLSerializer ):
void start() {
serializer.writeXMLDeclaration();
Element root = new Element("response");
root.addAttribute(new Attribute("found", Integer.toString(123)));
root.addAttribute(new Attribute("count", Integer.toString(542)));
serializer.writeStartTag(root);
serializer.flush();
}
void nextResult(Result result) {
Element element = result.createXMLRepresentation();
serializer.write(element);
serializer.flush();
}
void finish() {
serializer.writeEndTag();
serializer.flush();
}https://stackoverflow.com/questions/967288
复制相似问题