gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:15:54 25 4
gpt4 key购买 nike

我有两个类,如下所示,带有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com