Как получить потоковый итератор [узел] из большого XML-документа?

Мне нужно обработать XML-документы, которые состоят из очень большого количества независимых записей, например

<employees>
    <employee>
         <firstName>Kermit</firstName>
         <lastName>Frog</lastName>
         <role>Singer</role>
    </employee>
    <employee>
         <firstName>Oscar</firstName>
         <lastName>Grouch</lastName>
         <role>Garbageman</role>
    </employee>
    ...
</employees>

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

Я не могу просто scala.xml.XmlLoader.load (), потому что я не хочу хранить весь документ в памяти (или ждать закрытия входного потока), когда мне нужно работать только с одним запись за раз. Я знаю, что могу использовать XmlEventReader для потоковой передачи ввода в виде последовательности XmlEvents. Однако работать с ними гораздо менее удобно, чем с scala.xml.Node.

Я хотел бы каким-то образом получить из этого ленивый Iterator [Node], чтобы работать с каждой отдельной записью, используя удобный синтаксис Scala, сохраняя при этом использование памяти под контролем.

Чтобы сделать это сам, я мог бы начать с XmlEventReader, создать буфер событий между каждым совпадающим начальным и конечным тегами, а затем построить на его основе дерево узлов. Но есть ли более простой способ, который я упустил из виду? Спасибо за любые идеи!

9
задан David Soergel 15 December 2011 в 20:03
поделиться