2017-02-23 278 views
0
**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 являетсяКак создать вложенную корневой элемент в JAXB при создании XML из объекта Java с помощью JAXB

@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. Правильно ли используется класс объекта и аннотация, которые я использовал? может кто-то, пожалуйста, помогите мне в этом.

+0

Я чувствую, что ваш классный дизайн попал на неправильную дорожку. Ваш 'Automobiles' содержит« Список », а' Cars' содержит «Список '. Было бы гораздо более естественным, если бы «Автомобили» просто содержали «Список ». –

ответ

0

Вы не сказали, какая у вас проблема с вашим кодом. Но я наблюдал за этими вещами;

Вам нужен @XmlRootElement только на вашем корневом элементе, i.e. на class Automobiles, но не на других.

Вы используете аннотацию @XmlElement без указания name. Затем имя XML-элемента происходит от имени метода. Это нормально в большинстве случаев, но не во всех случаях. Например, в классе Bikes у вас есть

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

Это неявно преобразуется в XML-элемент <bikes>, который является неправильным, потому что вы хотите, чтобы быть сопоставлен <bike>. Вы можете исправить это двумя способами:

Либо указав имя явно в аннотации (предпочтительный способ)

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

Или путем изменения имени метода (не является предпочтительным, так как в единственном числе имя метода weird then)

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