我有一个大的XML文件(很多MB),我整个下载不起。
<doc>
<element>...</element>
<element>...</element>
...
<element>...</element>
</doc>
我需要从网上读取这个XML(或者更好 - 流式传输),然后从其正文中获取第一个N element
,以便使用XSLT模板处理它们。
您为此类任务推荐了哪些库/技术?我用Java写作。
最基本的问候,
Q值。
答案 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
因此直到现在才知道如何正确使用它。