如何使用jaxb在XML中自动增加id

时间:2014-06-12 09:08:01

标签: java xml jaxb

我使用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自动递增此值的规定。

请咨询

3 个答案:

答案 0 :(得分:2)

以下是使用XmlAdapter

映射此示例的方法

Java模型

<强>消息

以下是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

映射此示例的方法

Java模型

<强>消息

以下是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>