Как получить доступ к подмножеству данных XML в Java, когда данные XML являются слишком большими для умещений в памяти?

То, что я действительно хотел бы, является потоковым API, который работает вид подобного StAX и вид подобного DOM/JDom.

Это передало бы потоком в том смысле, что это будет очень лениво и не вещи чтения в, пока не необходимый. Это также передало бы потоком в том смысле, что это считает все вперед (но не назад).

Вот то, что кодирует, который использовал такой API, будет похож.

URL url = ...
XMLStream xml = XXXFactory(url.inputStream()) ;


// process each <book> element in this document.
// the <book> element may have subnodes.
// You get a DOM/JDOM like tree rooted at the next <book>.


while (xml.hasContent()) {
  XMLElement book = xml.getNextElement("book");
  processBook(book);
}

Чему-нибудь нравится, это существует?

1
задан Joachim Sauer 10 May 2010 в 11:21
поделиться

2 ответа

Вы можете сделать следующее:

  1. Просканировать XML файл с помощью SAX или StAX и немедленно сериализовать все обратно в StringBuilder, т.е. создать свою собственную копию XML файла.

  2. Если вы встретили endElement и знаете, что вам не нужно поддерево, которое вы только что разобрали, очистите StringBuilder.

  3. Если вам это нужно, вы можете построить дерево DOM из созданной вами "копии".

С помощью этого вы можете вернуться к стандартным фреймворкам, один для обычного разбора SAX, другой для обычного построения DOM. Только для пользовательской сериализации может потребоваться некоторая доработка.

Также это помогает, если вам нужно знать границы дерева заранее. (элементы книги в вашем примере) В противном случае потребуется дополнительная обработка.

1
ответ дан 3 September 2019 в 00:41
поделиться

Единственный способ разобрать часть документа без полной загрузки его в память - это использовать SAX парсер.

Вот некоторые официальные примеры SUN по использованию SAX: http://java.sun.com/developer/codesamples/xml.html#sax

1
ответ дан 3 September 2019 в 00:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: