Примечание: Я EclipseLink JAXB (MOXy) и являюсь членом JAXB 2 (JSR-222 ) экспертная группа.
Предполагается, что ваш XML-документ выглядит примерно так:
<?xml version="1.0" encoding="UTF-8"?>
<rows>
<row>
<col1>a1</col1>
<col2>b1</col2>
<col3>c1</col3>
</row>
<row>
<col1>a1</col1>
<col2>b2</col2>
<col3>c2</col3>
</row>
</rows>
Вы можете использовать аннотацию @XmlPath от MOXy и сделать что-то подобное. EclipseLink также включает реализацию JPA :
Ряды
Вам понадобится создать объект Root для хранения всего:
package forum8577359;
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Rows {
@XmlElement(name="row")
private List<A> rows;
}
A
Поскольку содержимое объектов A
, B
и C
находится на одном уровне, вы можете использовать аннотацию @XmlPath
MOXy и указать "."
XPath. Это говорит MOXy, что объект и объект, на который он ссылается, происходят на одном уровне:
package forum8577359;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;
@XmlAccessorType(XmlAccessType.FIELD)
public class A {
private String col1;
@XmlPath(".")
private B b;
}
B
Мы снова используем @XmlPath(".")
, чтобы отобразить отношения между B
и C
:
package forum8577359;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;
@XmlAccessorType(XmlAccessType.FIELD)
public class B {
private String col2;
@XmlPath(".")
private C c;
}
C
package forum8577359;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
public class C {
private String col3;
}
Демо
Следующий демонстрационный код можно использовать для запуска этого примера:
package forum8577359;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Rows.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum8577359/input.xml");
Rows rows = (Rows) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(rows, System.out);
}
}
jaxb.properties
Чтобы указать MOXy в качестве вашего JAXB-провайдера, вам нужно включить файл jaxb.properties
в тот же пакет, что и классы вашего домена, со следующей записью:
javax.xml.bind.context.factory = org.eclipse.persistence.jaxb.JAXBContextFactory
Для получения дополнительной информации