Я пытаюсь разархивировать 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>
Как вы видите, к элементу не прикреплено пространство имен, что имеет смысл для меня, потому что когда я пытаюсь получить метаданные, я не получаю нулевое значение, а пустой список