Использование @XmlPath с jaxb / MOXy для сопоставления сложного типа

У меня есть глубокая структура XML с множеством бессмысленных оболочек, которые я сопоставляю с одним классом Java. Отображение простых типов данных с помощью @XmlPath - это прогулка в парке, но когда дело доходит до типов, которые на самом деле требуют своего собственного класса, я не совсем уверен, как это сделать, особенно когда эти типы также должны быть включены в список.

У меня проблемы с отображением всехelement Типы в приведенном ниже примере к моемуElement класс. Посколькуelements Оболочка находится в ресурсе, который отображается с помощью@XmlPath Я не могу использовать@XmlElementWrapper, который иначе был бы способом, которым я обычно делал бы это.

Пример структуры XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<s:root xsi:schemaLocation="http://www.example.eu/test ResourceSchema.xsd" xmlns:s="http://www.example.eu/test" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <s:resource>
        <s:information>
            <s:date>2013-07-04</s:date>
            <s:name>This example does not work</s:name>
        </s:information>
        <s:elements>
            <s:refobj>
                <s:id>1</s:id>
                <s:source>First Source</s:source>
            </s:refobj>
            <s:refobj>
                <s:id>2</s:id>
                <s:source>Second Source</s:source>
            </s:refobj>
            <s:refobj>
                <s:id>5</s:id>
                <s:source>Fifth Source</s:source>
            </s:refobj>
        </s:elements>
    </s:resource>
</s:root>

Root.java

@XmlRootElement(name = "root")
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlPath("resource/information/date/text()")
    private String date;

    @XmlPath("s:resource/s:information/s:name/text()")
    private String name;

    @XmlPath("resource/elements/refobj")
    private List<RefObj> refObjs;

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

RefObj.java

@XmlRootElement(name = "refobj")
@XmlAccessorType(XmlAccessType.FIELD)
public class RefObj {

    @XmlElement(name = "id")
    private int id;

    @XmlElement(name = "source")
    private String source;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getSource() {
        return source;
    }

    public void setSource(String source) {
        this.source = source;
    }

}

ИАС / Unmarshaller

public static void main(String[] args) {
    String xml = getXML();

    Root root = null;
    try {
        JAXBContext context = JAXBContext.newInstance(Root.class);

        Unmarshaller unmarshaller = context.createUnmarshaller();

        StringReader stringReader = new StringReader(xml);

        root = (Root) unmarshaller.unmarshal(stringReader);
    } catch (Exception ex) {
        System.err.println("Failed to unmarshal XML!");
    }

    try {
        JAXBContext context = JAXBContext.newInstance(Root.class);
        Marshaller marshaller = context.createMarshaller();

        marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.example.eu/test ResourceSchema.xsd");

        StringWriter stringWriter = new StringWriter();
        marshaller.marshal(root, stringWriter);

        System.out.println(new String(stringWriter.toString().getBytes(Charset.forName("UTF-8"))));
    } catch (Exception ex) {
        System.err.println("Failed to marshal object!");
    }

}

package-info.java

@XmlSchema(
        namespace = "http://www.example.eu/test",
        attributeFormDefault = XmlNsForm.QUALIFIED,
        elementFormDefault = XmlNsForm.QUALIFIED,
        xmlns = {
    @XmlNs(
            prefix = "s",
            namespaceURI = "http://www.example.eu/test")
},
        location = "http://www.example.eu/test ResourceSchema.xsd")
package se.example.mavenproject1;

import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

Я могу выполнить приложение, но ни один элемент не отображается, когда я демаршалю / маршалирую содержимое XML, вместо этого я получаю представление XML, содержащее только информацию.

Обновить

После публикации предыдущего примера я понял, что на самом деле он работает как задумано, что еще больше запутало меня. Хотя я и пытался воспроизвести (ранее) работающий пример в моем рабочем коде, но безуспешно, хотя мне действительно удалось представить проблемы, с которыми я столкнулся, в коде примера. Поскольку мне нужно было добавить пространство имен для появления проблем, я предполагаю, что это как-то связано с соглашениями об именах и X (ml) Path.

Я также добавилpackage-info.java и маршаллер / демаршаллер, которого я использую при работе с этими объектами. Поскольку jaxb.properties не содержит ничего захватывающего, я не учел это.

Ответы на вопрос(2)

Ваш ответ на вопрос