您可以使用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
,所以直到現在才知道如何正確使用它。
在讀取XML元素時,使用SAX而不是DOM解析XML元素。當你有足夠的閱讀時,停止從InputStream中讀取東西並將其提供給XSLT處理器。 – Alex 2012-03-19 08:24:37
@Alex我同意你使用SAX,但XSLT處理器不會接受xml文件的片段,它需要一個有效的文件/樹/結構。除非你手動添加閉合文檔標籤,然後再將它提供給XSLT處理器 – Kennet 2012-03-19 08:34:34
@Kennet我不認爲有一種方法可以添加閉合文檔標籤,如果它從未從流中讀取。所以無論如何,你必須手動添加它。 – bezmax 2012-03-19 08:35:59