Как получить доступ к подмножеству данных XML в Java, когда данные XML слишком велики, чтобы поместиться в памяти? - PullRequest
1 голос
/ 10 мая 2010

Что мне действительно нужно, так это потоковый 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);
}

Существует ли что-нибудь подобное?

Ответы [ 2 ]

1 голос
/ 10 мая 2010

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

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

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

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

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

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

1 голос
/ 10 мая 2010

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

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

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