Если вы готовы рассмотреть возможность использования чего-то другого, кроме XStream, тогда EclipseLink JAXB (MOXy) легко обрабатывает двунаправленные свойства с помощью @ XmlInverseReference (я технический руководитель MOXy).
Ваша объектная модель будет отображаться как:
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Parent {
private List<Child> children;
@XmlElement(name="child")
public List<Child> getChildren() {
return children;
}
public void setChildren(List<Child> children) {
this.children = children;
}
}
и (обратите внимание на использование @XmlInverseReference для родительского свойства):
import org.eclipse.persistence.oxm.annotations.XmlInverseReference;
public class Child {
private Parent parent;
@XmlInverseReference(mappedBy="children")
public Parent getParent() {
return parent;
}
public void setParent(Parent parent) {
this.parent = parent;
}
}
Демонстрационная версиякод будет выглядеть так (input.xml ссылается на XML из вашего вопроса):
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Parent.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Parent parent = (Parent) unmarshaller.unmarshal(new File("input.xml"));
for(Child child : parent.getChildren()) {
System.out.println(child.getParent());
}
}
}
Чтобы указать MOXy в качестве реализации JAXB, вам нужно включить файл с именем jaxb.properties в тот же пакет, что и ваша модельклассы со следующей записью:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
Ниже приведена ссылка на мое сравнение JAXB и XStream: