2012-03-19 92 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