2011-11-30 2 views
1

Я разоблачаю сообщения, соответствующие приведенной ниже схеме, и хотел бы, чтобы возвращаемый корневой элемент был класса Bar. Вместо этого возвращаемый корневой элемент всегда является JAXBElement, содержащим имя «foo» со значением, равным требуемому элементу Bar.Использование XmlRootElement в JAXB во избежание использования корневого JAXBElement

Я думаю, что XmlRootElement можно использовать для этого в файле привязок, но пока этого не удалось. Есть идеи?

<xsd:element name="foo" type="Bar"/> 
<xsd:complexType name="Bar"> 
    <xsd:sequence> 
     <xsd:element name="goo" type="xsd:string"/> 
    </xsd:sequence> 
</xsd:complexType> 
+0

Спасибо, я должен был добавить, что я не могу изменить схему (ы). На самом деле это упрощенный случай, и в реальной жизни Bar импортируется из другой схемы. – EwanB

ответ

1

Поскольку может быть много глобальных элементов, которые соответствуют глобальному сложному типу, а JAXB осущий не генерирует @XmlRootElement аннотации этих классов. Вы можете объявить элемент с анонимным сложным типом.

<xsd:element name="foo"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element name="goo" type="xsd:string"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 

Когда метод unmarshal возвращает экземпляр JAXBElement вы можете получить объект домена, вызвав getValue().

+0

Спасибо, Блэз, это работает, но я ищу решение без изменения схемы. Является ли это возможным? – EwanB

+0

@EwanB - Следующие могут помочь: http://weblogs.java.net/blog/kohsuke/archive/2006/03/why_does_jaxb_p.html –

1

Вы можете настроить xsd:element с помощью jaxb:class, это создаст дополнительный класс для вашего элемента. Эта настройка может быть выполнена с помощью привязок:

<jaxb:bindings node="xsd:element[@name='foo']"> 
    <jaxb:class> 
</jaxb:bindings> 
Смежные вопросы