Java 如何使用XOM传输XML数据?

Java 如何使用XOM传输XML数据?,java,xml,streaming,xom,Java,Xml,Streaming,Xom,假设我想使用XML将大量搜索结果输出到PrintWriter或OutputStream中。生成的XML如下所示: <?xml version="1.0" encoding="UTF-8"?> <resultset> <result> [child elements and data] </result> ... ... [1000s of result elements more] </r

假设我想使用XML将大量搜索结果输出到PrintWriter或OutputStream中。生成的XML如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<resultset>
    <result>
       [child elements and data]
    </result>
    ...
    ...
    [1000s of result elements more]
</resultset>
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();

[子元素和数据]
...
...
[1000多个结果元素]
因为生成的XML文档可能很大(可能是数百兆字节),所以我希望以流式方式输出它(而不是在内存中创建整个文档,然后编写它)

一次输出一个
的粒度很好,所以我想一个接一个地生成一个
,并将其写入流中。换句话说,我只想做一些类似伪代码的事情(启用了自动刷新,所以不用担心):

open-stream/writer
写声明
写入的开始标记
虽然有更多的结果:
写入下一个元素
写入的结束标记
关闭流/写入程序
我已经看过了,但是必要的方法,
writeStartTag(Element)
writeEndTag(Element)
write(DocType)
是受保护的,不是公共的!除了将序列化程序子类化以使用这些方法,或者手动将开始和结束标记作为字符串直接写入流中,完全绕过XOM之外,没有其他方法了吗?(在这个简单的例子中,后者不会太糟糕,但在一般情况下,它会变得非常丑陋。)

我是否遗漏了什么,或者XOM不是为此而设计的?

有了它,我可以很容易地使用它——它有构造函数,这些构造函数接受
Writer
OutputStream
,还有方法
writeOpen(元素)
writeClose(元素)
writeDocType(文档类型)
等。与XOM的
序列化程序相比,XOM的
序列化程序
唯一的公共
写入
方法是获取整个
文档
的方法


(这与XOM是一个强有力的竞争者有关。)

据我所知,XOM不直接支持流媒体

当我想流式处理我的XML文档时,我使用的是,它具有流式XML序列化程序,类似于XOM中的标准序列化程序类。NUX与XOM兼容。我下载了NUX源代码,提取了几个NUX类(StreamingSerializer接口、StreamingXMLSerializer——适用于XOM文档、StreamingVerifier和NamespacesInsScope),将它们放在我的项目中,它就像一个符咒一样工作。太糟糕了,这不是直接在XOM中实现的:-(

NUX是XOM:的很好的伴侣,工作镜像下载:

链接到API:

下面是示例代码(调用方法的顺序是:
start()
,n*
nextResult()
finish()
,序列化程序正在从NUX流化XmlSerializer):


我也遇到了同样的问题,但发现做您提到的选项和子类序列化程序非常简单,如下所示:

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配置,如setIdentit等,但使用方式如下:

<?xml version="1.0" encoding="UTF-8"?>
<resultset>
    <result>
       [child elements and data]
    </result>
    ...
    ...
    [1000s of result elements more]
</resultset>
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();

是的,我认为这样做应该是可行的,但从来没有尝试过。感谢您验证这一点!在某种程度上,我认为这比引入另一个第三方库(参见Peter的答案)更好,只需简单的流媒体即可。(尽管如此,很遗憾XOM没有内置。)很好。我喜欢你的解决方案,下次需要时会尝试。另外,这里有一个下载链接,因为他们的网站已损坏,可能无法维护:@Ed:btw,stack overflow与wiki一样工作,你可以修改帖子……但你可能首先需要更多的“声誉”积分:-(@Peter:我知道,是的——我还没有足够的代表;否则我会为你编辑它的。总有一天!:)