JAXB绑定对另一个元素的引用列表

时间:2014-04-30 18:01:12

标签: java xml jaxb

通过示例更容易解释,

示例XML:

<root>  
 <company>
        <name>xyz</name>
        <employees>
           <employeeref>emp1</employeeref>
           <employeeref>emp2</employeeref>
        </employees>   
 </company>

      <employee id="emp1">
         <name>a</name>
         <age>12</age>   </employee>

      <employee id="emp2">
         <name>b</name>
         <age>24</age>   </employee>

      <employee id="emp3">
         <name>c</name>
         <age>36</age>   
      </employee> 
</root>

这需要Company.java和Employee.java。

我的问题是, 如何使用Jaxb注释将xml绑定到java对象?

3 个答案:

答案 0 :(得分:2)

您可以将@XmlID@XmlIDREF

结合使用

<强>员工

Employee类上,您需要注释哪个字段/属性将成为该对象的“键”。在JAXB中,这是通过@XmlID注释完成的。

@XmlAccessorType(XmlAccessType.FIELD)
public class Employee {

    @XmlAttribute
    @XmlID
    private String id;
}

<强>公司

Company类中,我们将指出我们要封送Employee的实例作为对真实对象的引用。这是使用@XmlIDREF注释完成的。

@XmlAccesorType(XmlAccessType.FIELD)
public class Company {

    @XmlElementWrapper
    @XmlElement(name="elementref")
    @XmlIDREF
    private List<Employee> employees;
}

<强>根

为了@XmlIDREF工作,对象必须使用@XmlElement注释映射到其他位置。在这个例子中,这发生在Root类。

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

    private Company company;

    @XmlElement(name="employee")
    private List<Employee> employees;

}

了解更多信息

您可以在我的博客上阅读有关@XmlID@XmlIDREF的更多信息:

答案 1 :(得分:-1)

我认为您需要以下课程,这里是示例,您可以通过其他方式来实现

Root    One class for Root
    | -- Company  Company class
    |  |
    |  | employess(List)  one more class for employess collection
    |         
    |         
    employee (collection) one class for employee

EmployeeData

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "root")
public class EmployeeData {
    @XmlElement
    private Company company;
    private List<Employee> employee; 
// getter/setter
}

公司

@XmlAccessorType(XmlAccessType.FIELD)
public class Company {
    @XmlElement(required = true)
    private String name;
    @XmlElement(required = true)
    private Employees employees;
//...// getter/setter
}

员工

@XmlAccessorType(XmlAccessType.FIELD)
public class Employee {
        @XmlElement
    private String name;
    private int age;
    @XmlAttribute(name = "id")
    private String id;
///// getter/setter
}

员工

@XmlAccessorType(XmlAccessType.FIELD)
public class Employees {
        private List<String> employeeref;

// getter / setter     }

答案 2 :(得分:-2)

Java类的结构可以形成树形层次结构,如XML文件中所述。 Java类中使用注释来描述此结构。 以下是使用的一些注释的列表:

  • @XmlRootElement:将类或枚举类型映射到XML元素。
  • @XmlAttribute:将JavaBean属性映射到XML属性。
  • @XmlElement:将JavaBean属性映射到从属性名称
  • 派生的XML元素

员工类可以是这样的:

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Employee {
    private String id;

    private String name;

    private String age;

    public String getId() {
        return id;
    }
    @XmlAttribute
    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }
    @XmlElement
    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }
    @XmlElement
    public void setAge(String age) {
        this.age = age;
    }
}