Jon*_*nik 4 java xml streaming xom
假设我想使用XOM将大量搜索结果(如XML)输出到PrintWriter或OutputStream中.生成的XML看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<resultset>
<result>
[child elements and data]
</result>
...
...
[1000s of result elements more]
</resultset>
Run Code Online (Sandbox Code Playgroud)
因为生成的XML文档可能很大(可能是几百兆字节),我想以流式方式输出它(而不是在内存中创建整个Document然后编写它).
<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
Run Code Online (Sandbox Code Playgroud)
我一直在寻找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是强有力的竞争者.)
我遇到了同样的问题,但发现做你提到的选项和子类Serializer非常简单,如下所示:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后你仍然可以利用各种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();
Run Code Online (Sandbox Code Playgroud)
据我所知,XOM不支持直接流式传输.
我想要流式传输XML文档时使用的是NUX,它具有Streaming XML Serializer,类似于XOM中的标准Serializer类.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()
,串行器是从StreamingXMLSerializer NUX):
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();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2429 次 |
最近记录: |