2010-06-30 5 views
12

Мне интересно, если JAXB не может создавать объект Java для элементов XML, которые служат в качестве оберток. Например, для XML следующей структурыОбработка вложенных элементов в JAXB

<root> 
    <wrapper> 
     <entity/> 
    </wrapper> 
</root> 

Я не хочу объект для <wrapper> быть создан на всех. Таким образом, для класса, как

class Root { 
    private Entity entity; 
} 

<entity> элемент должен быть unmarshalled непосредственно в поле объекта.

Можно ли достичь с помощью JAXB?

+0

В вашем примере, '' не будет генерироваться вовсе. Отправьте пример кода, который воспроизводит проблему. – skaffman

+0

Позвольте мне перефразировать его: как я могу аннотировать предоставленный класс, чтобы XML описанной структуры не мог быть им неармирован? – fnt

+0

Это не намного лучше. Пока неясно, что вы пытаетесь сделать. Нам нужен пример. – skaffman

ответ

6

Хотя это требует дополнительного кодирования, желательно демаршаллинг может быть сделан таким образом, используя временный объект обертки:

@XmlRootElement(name = "root") 
public class Root { 

    private Entity entity; 

    static class Entity { 

    } 

    static class EntityWrapper { 
     @XmlElement(name = "entity") 
     private Entity entity; 

     public Entity getEntity() { 
      return entity; 
     } 
    } 

    @XmlElement(name = "wrapper") 
    private void setEntity(EntityWrapper entityWrapper) { 
     entity = entityWrapper.getEntity(); 
    } 

} 
+0

Кажется, все нормально, но я думаю, что это сводится к простому развертыванию объекта, то есть присвоению N свойств от оболочки к новому объекту Root. Немного громоздкое решение ... –

+1

@ MichałZiobro Вы можете предоставить свое собственное решение, которое не громоздко. – fnt

-2

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

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

+2

Как объяснил Дуг Кларк, это можно сделать с помощью EclipseLink MOXy. –

+0

Этот ответ настолько вводит в заблуждение. Абсолютно возможно выполнить требуемый unmarshalling - http://stackoverflow.com/a/3155877/318054 – fnt

5

EclipseLink MOXy предлагает реализацию JAXB 2.2 с расширениями. Одной из расширенных возможностей является использование XPath для навигации по уровням XML, который вам не нужен в вашей модели домена.

Если вы посмотрите на:

http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted/MOXyExtensions

вы заметите, что имя клиента хранится внутри, но что имя является атрибутом Строка Клиента. Это достигается с помощью:

@XmlPath("personal-info/name/text()") 
public String getName() { 
    return name; 
} 

Я надеюсь, что это помогает,

Doug

+0

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

+3

Дополнительная гибкость отображения EclipseLink велика. Мне также очень нравится то, что разработчики сделали с поддержкой привязок XML во внешнем файле сопоставления, а не только через аннотации. Это позволяет сопоставить модель домена с несколькими XSD, версиями, а также с разными источниками данных без каких-либо помех –

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