Использование @XmlPath с jaxb / MOXy для сопоставления сложного типа
У меня есть глубокая структура XML с множеством бессмысленных обертокм отображение на один класс Java. Отображение простых типов данных с помощью @XmlPath - это прогулка по парку, но когда дело доходит до типов, которые действительно требуют своего собственного класса I 'Я не совсем уверен, как это сделать, особенно когда эти типы должны быть помещены в список.
у меня возникли проблемы, чтобы отобразить всеelement
Типы в приведенном ниже примере к моемуElement
учебный класс. Посколькуelements
Оболочка находится в ресурсе, который отображается с помощью@XmlPath
Я не могу использовать@XmlElementWrapper
, который иначе был бы способом, которым я обычно делал бы это.
Пример структуры XML
2013-07-04
This example does not work
1
First Source
2
Second Source
5
Fifth Source
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 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.I '
мы также добавилиpackage-info.java
и маршаллер / демаршаллер I 'м при работе с этими объектами. Поскольку jaxb.properties нене содержит ничего захватывающегомы оставили это.