2015-12-03 2 views
1

У меня есть очень сложная структура XML как такСвести JAXB объектов

<root> 
<a> 
    <b> 
     <c>testc</c> 
     <e>teste</e> 
    <b> 
    <d>testd</d> 
</a> 
... 
</root> 

с более чем 100 узлами. Узлы просты и не имеют атрибутов. Я использую xjc (JaxB binding compiler) для создания POJO-объектов из файла xsd. Но поскольку xsd имеет древовидную структуру, xjc генерирует 100 объектов.

Могу ли я выравнивать вывод, генерируемый XJC и имеют единый объект со всеми свойствами, как так:

class Root { 
private String c; 
private String e; 
private String d; 
... 
} 

вместо 100 объектов?

В идеале меня будет интересовать как маршаллинг, так и демонтаж с использованием этой концепции!

+0

Можете ли вы добавить XSD, пожалуйста? – Kenney

ответ

0

some documentation on cyclic references, но я не могу сказать из вашего XML, если это проблема.

Вы можете использовать свой подход Root, но вы потеряете возможность воспроизводить исходную структуру, игнорируя теги контейнера. Вы можете настроить многое и написать свои собственные сериализаторы фрагмента (de) даже, но в какой-то момент он становится слишком сложным при попытке подогнать дерево XML в однонаправленный JAXB POJO.

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

Альтернативный подход - просто загрузить XML в общую DOM и использовать XPath (например, //a/text()) для доступа к редактируемым узлам. Вероятно, вы используете геттеры и сеттеры для свойств, поэтому вы можете позвонить им private getText(String tagName) и private setText(String tagName, String value) для непосредственного чтения и изменения DOM. Эти функции будут просто использовать Document.getElementsByTagName и Node.(get|set)TextContent.

+0

Благодарим вас за ввод. У меня нет циклической проблемы. У меня просто много полей, и я пытаюсь автоматизировать как можно больше. Использование DOM не является решением, так как я работаю с большими документами. Также XSLT заставил бы меня написать сопоставления вручную, и я стараюсь избегать этого. – danidacar

+0

Если DOM слишком велика, чем JAXB, это будет - все дерево будет в памяти, только с другой моделью. Если память вызывает беспокойство, взгляните на [XStream] (http://x-stream.github.io/). В противном случае вам придется написать код, чтобы справиться со сложностью модели - это древовидная структура, а не плоский список. Показать XSD; Если в сгенерированном коде есть избыточность, а не в XSD, вы можете уменьшить это, добавив некоторые аннотации. – Kenney

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