Вы можете использовать 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();
PS Извините за путаницу с одним из моих комментариев, предлагающих использовать XMLStreamWriter
.Я никогда не использовал XMLEventWriter
, поэтому до сих пор не знал, как правильно его использовать.