【问题标题】:JAXB, XML mashal with @XmlID annotationsJAXB,带有@XmlID 注释的 XML 混编
【发布时间】:2015-09-16 08:30:23
【问题描述】:

我有两个类如下,带有 JAXB 注释。我已经查找了应对周期的方法,但我仍然不明白。在示例中,@XmlID 和@XmlIDREF 在这两个类中如何相互配合?为什么两个类中都有@XmlDREFs?有人可以帮忙解释这是如何工作的吗?提前谢谢了。

第一课:

@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);
    }
}

【问题讨论】:

  • 首先是什么方法 public Lecturer(String name) { 在客户类中没有返回类型。你生成代码了吗?
  • @robin 谢谢。很抱歉,我根据幻灯片输入了@edited。那是一个错字。我编辑了它。应该是客户
  • 另外应该在客户中应该有一个 addOrder 方法吧?
  • @robin 是的,你是对的。谢谢,对此我感到非常抱歉..我添加了它。

标签: java xml jaxb annotations marshalling


【解决方案1】:

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

@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>

【讨论】:

  • 谢谢。答案中的第二个@XmlID 应该是@XmlIDREF?那么用 @XmlIDREF 注释的字段不会包含在 XML 中吗?例如在 Order 类 @XmlElement(name="Customer") @XmlIDREF private List&lt;Customer&gt; _customers; 中,那么客户列表不会在 XML 中打印出来吗?那么@XmlElement(name="Customer") 有什么用,因为我们已经将根元素作为客户?
  • 感谢您的更正,使答案发生了变化。这个例子我是从客户的角度来测试的,所以就像我们有一个客户,他们有 id、name 和 order(这是另一个对象)。由于我们有 2 个 XmlElement,它们都将作为子元素出现。现在第二个元素是另一个在 id 上有 XMLID 的对象,这就是显示 ID 的原因。 XMLIDREF 就像客户对订单的参考。
猜你喜欢
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多