Читать ограниченное количество элементов из XML - PullRequest
0 голосов
/ 19 марта 2012

У меня есть большой XML-файл (много МБ), который я не могу позволить загрузить в целом.

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

Мне нужно прочитать этот XML из Интернета (или, что лучше, передать его в потоковом режиме), а затем взять первые N element s из его тела, чтобы обработать их с помощью шаблона XSLT.

Какую библиотеку / технику вы рекомендуете для такой задачи?Я пишу на Java.

С наилучшими пожеланиями,Q.

1 Ответ

1 голос
/ 19 марта 2012

Вы можете использовать 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, поэтому до сих пор не знал, как правильно его использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...