Работа с коллекциями JAXB - PullRequest
       0

Работа с коллекциями JAXB

9 голосов
/ 07 сентября 2011

Я пытаюсь разобрать следующий XML с использованием JAXB:

<Works>
    <Work>
        <Composers>
            <Composer>
                <Name>A name</Name>
            </Composer>
            <Composer>
                <Name>A name 2</Name>
            </Composer>
        </Composers>
    </Work>
</Works>

Я сгенерировал все классы, используя XJC.Если я хочу получить доступ к коллекции Композиторов, я должен сделать это:

 List<Composer> composers = work.getComposers().getComposer();

Можно ли как-нибудь сделать следующее?

 List<Composer> composers = work.getComposers();

Я ценю необходимостьКомпозиторы возражают, как это происходит от XML, но при работе с Java наличие промежуточного POJO, в котором хранятся коллекции, кажется немного избыточным.

Мой XSD:

<xsd:complexType name="Works">
    <xsd:sequence>
        <xsd:element name="Work" type="Work" maxOccurs="unbounded" minOccurs="0"></xsd:element>
    </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="Work">
    <xsd:sequence>
        <xsd:element name="Composers" type="Composers"></xsd:element>
    </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="Composers">
    <xsd:sequence>
        <xsd:element name="Composer" type="Composer" maxOccurs="unbounded" minOccurs="0"></xsd:element>
    </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="Composer">
    <xsd:sequence>
        <xsd:element name="Name" type="xsd:string"></xsd:element>
    </xsd:sequence>
</xsd:complexType>

Ответы [ 2 ]

6 голосов
/ 08 сентября 2011

Плагин @ XmlElementWrapper делает именно то, что вы хотите.

3 голосов
/ 16 апреля 2013

Для тех, кто не может или не хочет использовать плагин: Если вы можете жить с другой структурой XML, можно избежать генерации дополнительных классов-оболочек, просто используя maxoccurs="unbounded" и пропуская содержащий элемент. Используя оригинальный пример:

<xsd:element name="Work" type="Work" maxOccurs="unbounded" minOccurs="0"/>

<xsd:complexType name="Work">
    <xsd:sequence>
        <xsd:element name="Composer" type="Composer" maxOccurs="unbounded" minOccurs="0"/>
    </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="Composer">
    <xsd:sequence>
        <xsd:element name="Name" type="xsd:string"></xsd:element>
    </xsd:sequence>
</xsd:complexType>

создаст такую ​​структуру:

<Work>
    <Composer>
        <Name>A name</Name>
    </Composer>
    <Composer>
        <Name>A name 2</Name>
    </Composer>
</Work>

Это поместит метод в тип Work, который возвращает объект List<Composer>. К сожалению, метод называется getComposer вместо getComposers, но вы можете использовать аннотации или пользовательские привязки для решения этой проблемы.

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