Распаковка вложенных объектов с использованием JAXB - PullRequest
2 голосов
/ 06 сентября 2011

Я использую JAXB и не могу понять, почему мои вложенные объекты не распаковываются.Я генерирую классы с помощью команды XJC.

Например, когда я отменяю маршалинг объекта Works, коллекция Composers всегда содержит один экземпляр Composer с пустым именем.

Мой XML выглядит так:

<Works>
    <Work>
        <Composer>
           <Name>Test Name</Name>
        </Composer>
    </Work>
</Works>

и XSD выглядит следующим образом:

<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
jxb:version="2.0" xmlns:tns="http://www.example.org/test/"
targetNamespace="http://www.example.org/test/"> 

<element name="Works" type="tns:Work"></element>

<complexType name="Work">
    <sequence>
        <element name="Composers" type="tns:Composer" maxOccurs="unbounded"
            minOccurs="1">
        </element>
    </sequence>
</complexType>


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

И мой код, который выполняет расшифровку:

    JAXBContext jc = JAXBContext.newInstance("mypackagename");
    Unmarshaller um = jc.createUnmarshaller();
    Works works = (Works)um.unmarshal(new FileReader("src/main/resources/works.xml"));
    Work work = works.getWorks().get(0);
    Composer composer = work.getComposers().get(0);
    System.out.println(composer.getName());

Имя всегда NULL, хотя я знаю, что оно имеет значение.

1 Ответ

3 голосов
/ 06 сентября 2011

У вас может быть такая схема XML, как:

<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    jxb:version="2.0" xmlns:tns="http://www.example.org/test/"
    targetNamespace="http://www.example.org/test/">

    <element name="Works" type="tns:Works"></element>

    <complexType name="Works">
        <sequence>
            <element name="Work" type="tns:Work" maxOccurs="unbounded"/>
        </sequence>
    </complexType>

    <complexType name="Work">
        <sequence>
            <element name="Composer" type="tns:Composer" maxOccurs="unbounded"/>
        </sequence>
    </complexType>


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

</schema>

Это соответствует следующему XML:

<Works xmlns="http://www.example.org/test/">
    <Work>
        <Composer>
           <Name>Test Name</Name>
        </Composer>
    </Work>
</Works>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...