2012-03-19 67 views
0

我有一个大的XML文件(许多MB),我不能作为一个整体下载。阅读有限的元素XML从XML

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

我需要从网络读取此XML(或更好 - 它流),然后从它身上取前N element s到让他们使用XSLT模板处理。

对于这样的任务,你推荐什么库/技术?我正在用Java编写。

最亲切的问候,
Q.

+0

在读取XML元素时,使用SAX而不是DOM解析XML元素。当你有足够的阅读时,停止从InputStream中读取东西并将其提供给XSLT处理器。 – Alex 2012-03-19 08:24:37

+1

@Alex我同意你使用SAX,但XSLT处理器不会接受xml文件的片段,它需要一个有效的文件/树/结构。除非你手动添加闭合文档标签,然后再将它提供给XSLT处理器 – Kennet 2012-03-19 08:34:34

+0

@Kennet我不认为有一种方法可以添加闭合文档标签,如果它从未从流中读取。所以无论如何,你必须手动添加它。 – bezmax 2012-03-19 08:35:59

回答

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(); 

增加:

要编写结束标记,您应该创建一个关闭标记事件,并在需要时将其传递给相同的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,所以直到现在才知道如何正确使用它。

+0

**部分xml **注释意味着您的代码片段将仅下载在线XML的一部分并关闭所有必需的xml标签,对吗?然后,我只是阅读部分XML并做我喜欢的任何事情? – Queequeg 2012-03-20 11:02:25

+1

不,您仍然需要手动将结束标记写入'yourOutputStream'。 STAX并不确保所有标记都关闭,它只是简化了从/到流读取/写入XML而不打扰XML语法。您有2个选项:1.将结束标记直接写入'yourOutputStream'作为文本。 2.使用XMLStreamWriter封装yourOutputStream并通过它写入结束标记。 – bezmax 2012-03-20 11:07:41

+0

但我的其他解释是正确的? – Queequeg 2012-03-20 11:14:59