首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用XOM流XML数据?

如何使用XOM流XML数据?
EN

Stack Overflow用户
提问于 2009-06-08 22:14:39
回答 2查看 2.5K关注 0票数 4

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

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<resultset>
    <result>
       [child elements and data]
    </result>
    ...
    ...
    [1000s of result elements more]
</resultset>

因为生成的XML文档可能很大(可能是几百兆字节),所以我想以流的方式输出它(而不是在内存中创建整个文档,然后编写它)。

每次输出一个<result>的粒度很好,所以我希望生成一个又一个<result>,并将其写入流中。换句话说,我只是想做一些类似于这个伪代码的事情(启用自动刷新功能,所以不要担心):

代码语言:javascript
复制
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 --它有接受WriterOutputStream的构造函数,以及方法writeOpen(Element)writeClose(Element)writeDocType(DocumentType)等。与XOM的Serializer相比,唯一的公共write方法是整个Document的方法。

(这与关于最佳dom4j替代品的问题有关,XOM是一个强有力的竞争者。)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-25 22:53:20

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

代码语言:javascript
复制
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等),但是可以这样使用它:

代码语言:javascript
复制
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();
票数 7
EN

Stack Overflow用户

发布于 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 ):

代码语言:javascript
复制
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();
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/967288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档