java - JAXB、带有 @XmlID 注释的 XML mashal

标签 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);
    }
}

最佳答案

根据您的示例,我假设客户与其所下订单之间存在多对多关系。

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

@XmlIDREF - 您可以将其视为某些其他对象的引用(在客户类的情况下其顺序,反之亦然,它就像数据库中的外键)。

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

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>

关于java - JAXB、带有 @XmlID 注释的 XML mashal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32603410/

相关文章:

java - 查找文件中出现最长单词的行号

java - java 黑 jack

javascript - 我如何识别 Firefox 中 xml 属性中的新行?

javascript - onmousedown 在动态生成的 html 元素上

java - 如何访问另一个 xml 元素中的 xml 元素(JAXB 绑定(bind)

java - 创建一个目录,然后在其中创建文件

java - 为什么 Hashmap 允许空键?

javascript - 如何在 extendscript 中将新元素添加到现有 XML 文件中?

java - 通过其 ID 序列化 JAXB 对象?

java - 在 Eclipse 上安装和使用 jersey