JAXB,带有@XmlID注释的XML mashal

时间:2015-09-16 08:30:23

标签: java xml jaxb annotations marshalling

我有两个类,如下所示,使用JAXB注释。我已经注意到应对周期,但我仍然没有得到它。在这个例子中,@ XmlID和@XmlIDREF如何在这两个类中相互协作?为什么两个类中都有@XmlDREF?有人可以帮忙解释一下这是如何工作的吗?提前谢谢了。

第一课:

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

    private static int NEXT_ID = 0;
    @XmlID
    @XmlAttribute(name="xml-id")
    private String _xmlId;

    @XmlElement(name="name")
    private String _name;

    @XmlElementWrapper(name="orders-made")
    @XmlElement(name="orders")
    @XmlIDREF
    private List<Order> _ordersMade;

     protected Customer() { 
        this(null);
     }

   public Customer (String name) {
       _name = name;
       _ordersMade = new ArrayList<Order>();

       NEXT_ID++;
       _xmlId = getClass().getName() + ":" + NEXT_ID;
    }

    public String getName() {
       return _name;
    }
    public void addOrder(Order order) {
    _ordersMade.add(order);
    order.addCustomer(this);
}
}

第二类:

 @XmlAccessorType(XmlAccessType.FIELD)
 public class Order {

     private static int NEXT_ID = 0;

     @XmlID
     @XmlAttribute(name="xml-id")
     private String _xmlId; 

     @XmlElement(name="Customer")
     @XmlIDREF
     private List<Customer> _customers;

     @XmlElement(name="name")
    private String _name;

     protected Order() {
        this(null);
     }

    public Order(String name) {
         _name = name;
         _customers = new ArrayList<Customer>();

          NEXT_ID++;
        _xmlId = getClass().getName() + ":" + NEXT_ID;
     }

    public String getName() {
       return _name;
    }

   void addCustomer(Customer customer) {
       _customers.add(customer);
    }
}

1 个答案:

答案 0 :(得分:1)

从你的例子中我假设客户与他们所订单之间存在多对多的关系。

@XmlID - 您可以将其视为元素的ID(比如客户或在数据库中订购它的键)。

@XmlIDREF - 您可以将此视为某个其他Object的引用(如果客户类是其顺序,反之亦然,它就像数据库中的外键)。

最好的方法是尝试下面的程序

Customer c1 = new Customer("Robin");
Order o1 = new Order("Phone");
c1.addOrder(o1);
JAXBContext jc = JAXBContext.newInstance(Customer.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(c1, System.out);

它会输出类似

的输出
<customer xml-id="Customer:1">
    <name>Robin</name>
    <orders-made>
        <orders>Order:1</orders>
        <orders>Order:2</orders>
    </orders-made>
</customer>

订单显示为顺序1和2,因为id是按顺序的关键元素,现在将@XmlID从id更改为订单类中的name并重新运行程序,它将提供如下输出。

<customer xml-id="Customer:1">
    <name>Robin</name>
    <orders-made>
        <orders>Phone</orders>
        <orders>Tab</orders>
    </orders-made>
</customer>