jaxb unmarshal возвращает пустой список для xml с пространством имен и рекурсией - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь разархивировать xml с пространством имен, но он продолжает возвращать пустой список для набора

xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://profileConfig" xmlns="http://profileConfig"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="Profile">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="metadata" minOccurs="1" maxOccurs="1">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element ref="data" minOccurs="0" maxOccurs="unbounded" />
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="ProfileID" type="xs:ID" use="required" />
    </xs:complexType>
</xs:element>

<xs:element name="data">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="data" minOccurs="0" maxOccurs="unbounded"></xs:element>
        </xs:sequence>
        <xs:attribute name="name" type="xs:string" use="required" />
        <xs:attribute name="value" type="xs:string" use="optional" />
    </xs:complexType>
</xs:element>

. java

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "metadata"
})
@XmlRootElement(name = "Profile")
public class Profile {

    @XmlElement(required = false)
    protected Metadata metadata;
}

Метаданные. java

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "data"
})
@XmlRootElement(name = "metadata")
public class MetaData {

    @XmlElement(required = false)
    protected Set<Data> data = new HashSet();
}

Данные. java

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "data"
})
@XmlRootElement(name = "data")
public class Data {

    @XmlAttribute(name="name")
    protected String name = "";

    @XmlElement(required=false)
    protected Set<Data> data = new HashSet();
}

профиль. xml

<?xml version="1.0" encoding="utf-8"?>
<Profile ProfileID="123456789" xmlns="http://profileConfig">
    <metadata>
        <data name="Type" value="A">
        <data name="Options">
            <data name="Option" value="option1" />
            <data name="Option" value="option2" />
        </data>
    <metadata>
</Profile>

Я читаю файл xml и демаршаллинг в объект профиля в java

JAXBContext jaxbContext = JAXBContext.newInstance(Profile.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Profile profile = (Profile) jaxbUnmarshaller.unmarshal(new File("<PATH_TO_XML_FILE>"));

Функция getMetaData () профиля возвращает пустой список без каких-либо исключений или ошибок. Я не уверен, где именно я допустил ошибку.

Если я удаляю пространство имен из xml, оно работает как положено. Используя

<Profile ProfileID="123456789">...</Profile>

UPDATE, я попытался упорядочить, и я думаю, что с моим определением пространства имен что-то не так.

Profile profile = new Profile();
Data data = new Data();
data.setName("Type");
data.setValue("A");
MetaData metadata = new MetaData();
metadata.addData(data);
profile.setMetadata(metadata);

JAXBContext jaxbContext = JAXBContext.newInstance(Profile.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
StringWriter sw = new StringWriter();
jaxbMarshaller.marshal(employee, sw);
String xmlContent = sw.toString();
System.out.println(xmlContent);

output

<ns2:Profile xmlns:ns2="http://profileConfig">
    <ns2:metadata>
        <data name="Type" value="A"/>
    </ns2:metadata>
</ns2:Profile>

Как вы видите, к элементу не прикреплено пространство имен, что имеет смысл для меня, потому что когда я пытаюсь получить метаданные, я не получаю нулевое значение, а пустой список

...