如何使用JAXB从Java对象创建xml时在JAXB中创建嵌套的根元素

时间:2017-02-23 10:13:48

标签: java xml jaxb

**XML to be generated from java object**  
 <automobiles>
    <cars>
        <type></type>
        <car>
            <model></model>
            <maxspeed></maxspeed>
        </car>
        <car>
            <model></model>
            <maxspeed></maxspeed>
        </car>
    </cars>
    <bikes>
        <type></type>
        <bike>
            <model></model>
            <maxspeed></maxspeed>
        </bike>
        <bike>
            <model></model>
            <maxspeed></maxspeed>
        </bike>
    </bikes>
</automobiles>

//保存xml值的对象类是

@XmlRootElement(name = "automobiles")
class Automobiles {
    private List<Cars> cars = null;
    private List<Bikes> bikes = null;

    @XmlElement
    public List<Bikes> getBikes() {
        return bikes;
    }

    public void setBikes(List<Bikes> bikes) {
        this.bikes = bikes;
    }

    @XmlElement
    public List<Cars> getCars() {
        return cars;
    }

    public void setCars(List<Cars> cars) {
        this.cars = cars;
    }
}

@XmlRootElement(name = "cars")
class Cars {
    private List<Car> car = null;

    @XmlElement
    public List<Car> getCar() {
        return car;
    }

    public void setCar(List<Car> car) {
        this.car = car;
    }
}

@XmlRootElement(name = "bikes")
class Bikes {
    private List<Bike> bike = null;

    @XmlElement
    public List<Bike> getBikes() {
        return bike;
    }

    public void setBikes(List<Bike> bike) {
        this.bike = bike;
    }
}

@XmlRootElement(name = "Car")
class Car {
    private String model = null;
    private String maxspeed = null;

    @XmlElement
    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    @XmlElement
    public String getMaxspeed() {
        return maxspeed;
    }

    public void setMaxspeed(String maxspeed) {
        this.maxspeed = maxspeed;
    }
}

@XmlRootElement(name = "Bike")
class Bike {
    private String model = null;
    private String maxspeed = null;

    @XmlElement
    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    @XmlElement
    public String getMaxspeed() {
        return maxspeed;
    }

    public void setMaxspeed(String maxspeed) {
        this.maxspeed = maxspeed;
    }
}

这里的上面的xml是我需要使用JAXB编组生成的格式。 我是JAXB的新手。我使用的对象类和注释是否正确?有人可以帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

您没有说明您的代码存在哪个问题。 但我观察了这些事情;

您只需要根元素@XmlRootElement, 即class Automobiles,但不是其他人。

您使用@XmlElement注释而未指定name。 然后,XML元素名称从方法名称派生。 在大多数情况下这很好,但并非在所有情况下都如此。 例如,在课程Bikes中,您有

@XmlElement
public List<Bike> getBikes() { ... }

这隐式映射到XML元素<bikes>, 这是错误的,因为您希望将其映射到<bike>。 您可以通过两种方式解决此问题:

通过在注释中明确指定名称(首选方式)

 @XmlElement(name = "bike")
 public List<Bike> getBikes() { ... }

或者通过更改方法名称(不是首选,因为奇异的方法名称很奇怪)

 @XmlElement
 public List<Bike> getBike() { ... }