您可以使用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