Java / XML: хорошая «потоковая» альтернатива JAXB? - PullRequest
0 голосов
/ 06 апреля 2010

JAXB значительно упрощает работу с XML, но в настоящее время у меня есть большая проблема, что документы, которые я должен обрабатывать, слишком велики для того, чтобы в памяти не было ничего такого, что делает JAXB.Данные могут быть до 4 ГБ на документ.

Структура данных, которую мне придется обработать, очень проста и плоска: с корневым элементом и миллионами «элементов»…

<root>
<element>
<sub>foo</sub>
</element>
<element>
<sub>foo</sub>
</element>
</root>

Возможны следующие вопросы:

  1. Может ли JAXB каким-либо образом поддерживать демаршаллинг «потоковым» способом, который не требует построения целого дерева объектов в памяти, а скорее дает мне своего рода «итератор» для элементов, элемент за элементом?(Может быть, я просто что-то упустил…)

  2. Если нет, то каковы ваши предложения по хорошей альтернативе с a.«Плоская кривая обучения, в идеале очень похожая на JAXB b.И ОЧЕНЬ ВАЖНО: В идеале, с возможностью / инструментом для генерации кода unarshaller из файла XSD ИЛИ аннотированного Java-класса

3. (Я искал SO и те в библиотеке, которая закончиласьв моем «списке наблюдения» (не сравнивая их ближе) были Apache XML Beans и Xstream… Какие еще библиотеки, возможно, даже лучше для этой цели и какие недостатки, adavangaes…

Большое спасибо !!!Jan

Ответы [ 4 ]

3 голосов
/ 06 апреля 2010

Это все неправильный подход, так как все они в основном "бобовые" картографы. То есть конвертировать XML-документ в Java Bean. Для того, чтобы сделать это, вам в значительной степени придется всосать все это в машину.

Теперь, очевидно, есть "лучшие" способы, которыми это можно сделать. Например, на самом деле нет необходимости загружать весь XML DOM, чтобы отобразить бин, но я не знаю, как на самом деле JAXB и др. Выполняют их сериализацию. Я подозреваю, что они не беспокоятся о DOM, а скорее заполняют поля bean-компонентов напрямую, так как XML-поток передается. Это сохранит общую обработку, но вы все равно получите весь документ в ОЗУ как набор экземпляров классов.

Теперь, если вам нужен небольшой фрагмент XML-документа, вы можете рассмотреть реализацию StAX. Это DOM-подобный интерфейс поверх потокового парсера. Хотя, в конце концов, это может быть не очень хорошо, так как я думаю, что они работают, передавая столько документов, сколько необходимо, что означает, что если вам нужно что-то впереди, вы выигрываете, потому что это может отбросить все остальное. Но если вы хотите что-то в конце, я думаю, что это сохраняет большую часть того, что он видел до этого момента. Это тоже не хорошо.

Что оставляет вас с хорошим 'SAX. И все знают, что с SAX вы получаете блюз. Потому что это такой примитивный слой. Но он самый эффективный и дает вам максимальный контроль.

Отображение XSD будет трудным, просто потому, что прелесть структур отображения состоит в том, что они знают, что делать со всеми элементами (они создают экземпляры классов и помещают их в родительские классы). Вы хотите сделать что-то другое, что-то произвольное в произвольных точках.

SAX не так уж и плох, я написал хороший маленький грубый маппер, который позволяет вам делать то, что вы хотите делать, за исключением того, что вы должны вручную писать код, а не использовать XSD, и это в Obj-C, не Java. Но в основном он прошел XML-поток и искал сеттеры для классов на основе имени пути. Это заменило типичные огромные цепочки "if element =" name "..." в обратном вызове элемента, который вы получаете с кодом SAX.

Не тот ответ, который вы искали, я уверен ... будьте счастливы, если я ошибся.

2 голосов
/ 07 апреля 2010

Я бы копал подход JAXB / StAX (для чего-то на основе потоков, но с типизированными объектами Java). Взгляните на этот пост (хотя это скорее намек, чем сильный отрыв).

0 голосов
/ 07 апреля 2010

Я написал такую ​​ библиотеку , давным-давно - 6+ лет назад, для Java 1.4. С тех пор, как я закончил работу над докторской диссертацией, он остается нетронутым и не работает на современных JVM из-за использования внутренних API для вызова javac в сгенерированном коде Java.

Р.П. Бурре вел список инструментов, связанных с привязкой данных, которые могут представлять интерес.

Я бы порекомендовал использовать проект Apache Commons Digester , так как он основан на SAX. Старый учебник показывает его использование. Суть в том, что вы настраиваете сопоставление шаблонов вложенных элементов в XML с действиями в Java (например, создаете новый объект, задаете поле), чтобы построить свою структуру данных, и вы можете подключить обработку для каждого элемента в эту систему. 1013 *

Обратите внимание, что система метантенка не генерируется из Схемы или похожа на JAXB - но я думаю, учитывая простоту структуры и входной размер, это не должно вызывать беспокойства.

0 голосов
/ 07 апреля 2010

Ключом к привязке данных большого документа является использование XPath для выбора только тех элементов, которые вам нужны, и фильтрации всего остального ... см. Статью ниже

http://onjava.com/pub/a/onjava/2007/09/07/schema-less-java-xml-data-binding-with-vtd-xml.html

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