如何使用XOM流式传输XML数据?
假设我想使用XOM将大量搜索结果(如XML)输出到PrintWriter或OutputStream中。 生成的XML看起来像这样:
[child elements and data] ... ... [1000s of result elements more]
因为生成的XML文档可能很大(可能是几百兆字节),我想以流式方式输出它(而不是在内存中创建整个Document然后编写它)。
一次输出一个的粒度很好,所以我想生成一个又一个
,并将其写入流中。 换句话说,我只想做类似这样的伪代码(启用自动刷新,所以不要担心):
open stream/writer write declaration write start tag for while more results: write next element write end tag for close stream/writer
我一直在看Serializer
,但必要的方法, writeStartTag(Element)
, writeEndTag(Element)
, write(DocType)
都受到保护,而不是公开的! 除了将Serializer子类化为能够使用这些方法,或者将开始和结束标记作为字符串直接手动写入流中,完全绕过XOM之外,没有其他方法吗? (后者在这个简单的例子中不会太糟糕,但在一般情况下会变得非常难看。)
我错过了什么或XOM是不是为此而做的?
使用dom4j,我可以使用XMLWriter
轻松完成这项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); } }
然后你仍然可以利用各种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();
据我所知,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()
,序列化程序是来自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(); }
- 当存在多个构造函数时,使用autowire =“constructor”进行dependency injection?
- 将hashmap转换为stringarray
- 为什么我在Eclipse中使用javascript自动完成时会收到消息:“未处理的事件循环exceptionJava堆空间”?
- Java Generics:在arraylist(无界通配符类型)上,add和addAll方法的行为有所不同
- ElementType.LOCAL_VARIABLE注释类型
- j_security_check重定向
- 如何使用Java代码将文档添加到Alfresco存储库?
- Spring Test DBunit警告
- 如何在使用Java Web Services时访问HttpServletRequest对象