我使用JAXB生成以下XML。请参阅下面的XML
<Messages>
<Message id ="1">
<lastname>gg</lastname>
<firstname>cc</firstname>>
</Message>
<Message id ="2">
<lastname>ftrtr</lastname>
<firstname>mnn</firstname>>
<Message>
<Message id ="3">
<lastname>ftrtr</lastname>
<firstname>mnn</firstname>>
<Message>
请注意id,值为1,2,3。
我需要一个使用JAXB自动递增此值的规定。
请咨询
答案 0 :(得分:2)
以下是使用XmlAdapter
:
<强>消息强>
以下是Message
课程。我们会在XmlAdapter
字段中添加id
:
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlAccessorType(XmlAccessType.FIELD)
public class Message {
@XmlAttribute
@XmlJavaTypeAdapter(IDAdapter.class)
private Integer id = 0;
}
<强> IDAdapter 强>
以下XmlAdapter
将调整id
属性。请参阅下面的Demo
课程,了解我们如何充分利用此课程:
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class IDAdapter extends XmlAdapter<Integer, Integer> {
private int counter = 1;
@Override
public Integer unmarshal(Integer v) throws Exception {
return v;
}
@Override
public Integer marshal(Integer v) throws Exception {
return counter++;
}
}
讯息强>
以下是完成该示例的剩余课程。
import java.util.*;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="Messages")
@XmlAccessorType(XmlAccessType.FIELD)
public class Messages {
@XmlElement(name="Message")
private List<Message> messages = new ArrayList<Message>();
public List<Message> getMessages() {
return messages;
}
}
<强>演示强>
在下面的演示代码中,在IDAdapter
上设置Marshaller
的实例。这样做会使IDAdapter
有状态。如果我们不这样做,则每次使用时都会创建IDAdapter
的新实例,输出将始终为id="1"
。
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Messages.class);
Messages messages = new Messages();
messages.getMessages().add(new Message());
messages.getMessages().add(new Message());
messages.getMessages().add(new Message());
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setAdapter(new IDAdapter());
marshaller.marshal(messages, System.out);
}
}
<强>输出强>
以下是运行演示代码的输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Messages>
<Message id="1"/>
<Message id="2"/>
<Message id="3"/>
</Messages>
答案 1 :(得分:0)
转换之前,您应该在List<Message>
中使用class Messages
类型。
您可以使用列表中的任何迭代来增加id。增加后,您可以使用JAXB将其转换为XML。
基本上,您需要在将其转换为xml之前根据您的要求增加它。
答案 2 :(得分:0)
以下是使用Marshaller.Listener
:
<强>消息强>
以下是Message
课程。
import javax.xml.bind.annotation.*;
public class Message {
private Integer id = 0;
@XmlAttribute
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
讯息强>
以下是完成该示例的剩余课程。
import java.util.*;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="Messages")
@XmlAccessorType(XmlAccessType.FIELD)
public class Messages {
@XmlElement(name="Message")
private List<Message> messages = new ArrayList<Message>();
public List<Message> getMessages() {
return messages;
}
}
<强>演示强>
在下面的演示代码中,我们将使用Marshaller.Listener
的实例在编组之前设置id
Message
属性的值。
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Messages.class);
Messages messages = new Messages();
messages.getMessages().add(new Message());
messages.getMessages().add(new Message());
messages.getMessages().add(new Message());
Marshaller marshaller = jc.createMarshaller();
marshaller.setListener(new Marshaller.Listener() {
private int counter = 1;
public void beforeMarshal(Object object) {
if(object instanceof Message) {
((Message) object).setId(counter++);
}
}
});
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setAdapter(new IDAdapter());
marshaller.marshal(messages, System.out);
}
}
<强>输出强>
以下是运行演示代码的输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Messages>
<Message id="1"/>
<Message id="2"/>
<Message id="3"/>
</Messages>