JAXB乱序解组引用@XmlID和@XmlIDREF

时间:2015-10-06 15:02:44

标签: java xml jaxb

我有以下xml:

Company.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<company>
    <employeeList>
        <employee name="Jane Doe" id="A">
        </employee>
        <employee name="John Smith" id="B">
        </employee>
        <employee name="Anne Jones" id="C">
        </employee>
    </employeeList>
</company>

Department.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<departmentList>
    <departmentList>
        <department name="Dev" id="1">
            <employee>A</employee>
            <employee>B</employee>
        </department>
        <department name="Sales" id="2">
            <employee>C</employee>
        </department>
    </departmentList>
</departmentList>

类Department.java有一个员工清单

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Department {

    @XmlAttribute
    private String id;

    @XmlElement(name="employee")
    @XmlJavaTypeAdapter(EmpAdapter.class)
    public List<Employee> employeeList; 

    public Department(){
        employeeList = new ArrayList<Employee>();
    }

并且employee.java类具有带@XmlId标记的id属性。

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Employee {

        @XmlAttribute
        @XmlID
        private String id;

我知道如何使用适配器从department对象获取employee对象。但是,如果首先解组了Company.xml文件,因为它中包含员工详细信息。

所以我想要的是能够首先解组Department.xml并让它创建一些占位符,这样一旦解压了Company.xml,就会填写department对象中的employeeList。

修改

可能的解决方案:正如@laune所建议的,我可以使用适配器创建Employee对象作为占位符,然后在解组员工列表后,在部门下的员工对象中填写这些详细信息类

我需要什么: 但是这种方式我必须始终通过代码和新方法单独处理每个案例。主要问题是我无法预测解组将发生的顺序。有没有办法让JAXB unmarshall而不用担心创建对象的依赖关系和排序?也许使用架构?

1 个答案:

答案 0 :(得分:0)

您可以修改EmpAdapter以返回从(附加)构造函数创建的占位符Employee对象

public Employee( String id ){
    this.id = id;
}

此外,EmpAdapter应该为员工维护Map<String,Employee>映射ID。

将员工解组为平面列表后,迭代列表并从列表元素中填充占位符(通过地图定位)的字段。

如果员工数据包含deparment id,事情会容易得多。