2013-05-30 3 views
2

Недавно я создал серию объектов на основе XSD с использованием инструмента xjc. Проблема заключается в том, что я получаю XML из источника, который выглядит так:JAXB извлекает отдельные элементы из XML

<foos> 
</foos> 
<foo> 
</foo> 
<foo_detail_1> 
</foo_detail_1> 
<foo_detail_2> 
</foo_detail_2> 

Какой из них не идеален. Мой вопрос в том, когда я хочу разобрать XML, как я могу создать каждый отдельный объект? То есть вот так:

Foo foo = (Foo)um.unmarshal("myXML.xml"); 
Foo_Detail_1 fd = (Foo_Detail_1)um.unmarshal("myXML.xml"); 

Или это скорее упражнение в использовании XPath для заполнения этих атрибутов и если это так, что это правильный способ приблизиться к этому?

ответ

2

ВАРИАНТ # 1 - Использование JAXB с StAX

Вы можете разобрать XML с StAX XMLStreamReader затем перейти к foos элементу и распаковать экземпляр Foos. Затем переместите XMLStreamReader в элемент foo и отмените пример Foo и так далее.

Дополнительная информация

ВАРИАНТ # 2 - Создание Wrapper Объект

Вы можете создать объект оболочки, соответствующий корневой элемент, затем разобрать пример этого и получить отдельного объекты из него.

+1

Я бы предпочел, чтобы это было сделано за один проход, возможно ли предотвратить повторение полного документа несколько раз? FWIW весь файл поместится в памяти – Woot4Moo

+0

@ Woot4Moo - Парсер StAX будет проходить только один раз. В качестве альтернативы вы можете создать корневой объект, который содержит все отдельные объекты. –

+0

Итак, если я создаю узел обертки, я могу просто сделать Wrapper w = (Wrapper) unmarshall (myXml.xml) 'и чем играть с коллекцией объектов? – Woot4Moo

Смежные вопросы