从XML中读取有限数量的元素

时间:2012-03-19 08:10:58

标签: java xml streaming

我有一个大的XML文件(很多MB),我整个下载不起。

<doc>
   <element>...</element>
   <element>...</element>
   ...
   <element>...</element>
</doc>

我需要从网上读取这个XML(或者更好 - 流式传输),然后从其正文中获取第一个N element,以便使用XSLT模板处理它们。

您为此类任务推荐了哪些库/技术?我用Java写作。

最基本的问候,
Q值。

1 个答案:

答案 0 :(得分:1)

您可以使用STAX读取元素并将其子集重定向到不同的流:

final XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
final XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newInstance();
final XMLEventReader xmlReader = xmlInputFactory.createXMLEventReader(yourInputStream);
final XMLEventWriter xmlWriter = xmlOutputFactory .createXMLEventWriter(yourOutputStream); //The place where the resulting partial XML will go

while (xmlReader.hasNext()) {
    XMLEvent event = xmlReader.nextEvent();

    if (event ... some validation) {
        xmlWriter.add(event); //Forward it to xmlWriter
    }

    if (we have read enough elements) {
        break;
    }
}
xmlReader.close();
xmlWriter.flush();
xmlWriter.close();

<强>增加:

要编写结束标记,您应该创建一个close标记事件,并在需要时将其传递给同一个XMLEventWriter对象。为此,您需要一个XMLEventFactory的实例。以下是编写结束标记的示例:

XMLEventFactory eventFactory = XMLEventFactory.newInstance();
XMLEvent closeTagEvent = eventFactory.createEndElement("prefix", "http://namespace.com", "elementName");
//This will create a closing tag event for a previously opened <prefix:elementName xmlns:prefix="http://namespace.com">

xmlWriter.add(closeTagEvent);

xmlWriter.flush();
xmlWriter.close();

P.S。很抱歉与我的一条评论混淆,建议使用XMLStreamWriter。我从未使用XMLEventWriter因此直到现在才知道如何正确使用它。