Xstream для сопоставления «выбора» элементов XML - PullRequest
2 голосов
/ 17 сентября 2010

Мне нужно отобразить XML, ограниченный XSD-объектом Java, используя XStream. XSD имеет 4 элемента сложного типа, которые являются элементами «выбора», то есть любой из этих 4 может присутствовать в XML под корневым тегом.

Я смотрю на XStream, но мне кажется, что для отображения такого XML мне потребуется 8 классов. Как? вот оно ...

Скажем, например, мой корневой элемент - VEHICLE, и каждый из сложных типов в XML: a) АВТОМОБИЛЬ b) ВЕЛОСИПЕД c) ГРУЗОВИК d) ТРАКТОР. У каждого из них есть различные свойства в них. Чтобы отобразить это в Xstream и сделать XML (сгенерированный XStream) XSD-совместимым, нам потребуется 8 классов, а именно. VehicleCarWrapper -> (имеет) Автомобиль , VehicleTruckWrapper -> (имеет) Грузовик , VehicleBikeWrapper - > (имеет) велосипед и VehicleTractorWrapper -> (имеет) трактор .

У кого-нибудь есть предложение, кроме потертого решения? Есть ли способ в Xstream отобразить такой «выборочный» элемент корня XML? Таким образом, все 4 (а именно: грузовик, автомобиль, мотоцикл, трактор) могут входить в оболочку как связанные сущности, но XStream всегда игнорирует все, кроме одной ассоциации, и, следовательно, создает XSD-совместимый XML.

Надеюсь, мой вопрос понятен.

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 09 октября 2010

Почему бы не использовать вместо этого JAXB:

@XmlRootElement
public class Foo {
    @XmlElements(
        @XmlElement(name="car", type=Car.class),
        @XmlElement(name="bike", type=Bike.class),
        @XmlElement(name="truck", type=Truct.class),
        @XmlElement(name="tractor", type=Tractor.class)
    )
    public Vehicle vehicle;
}

Для сравнения JAXB & XStream см .:

0 голосов
/ 06 октября 2010

Вот решение:

Класс автомобиля:

Общественный автомобиль класса { @XStreamAlias ​​( "vehicleAttribute") String vehicleAttribute;

}

Класс автомобиля:

@XStreamAlias("car")
public class Car extends Vehicle {
    @XStreamAlias("carattribute")
    String carAttribute;
}

Класс велосипеда:

@XStreamAlias("bike")
public class Bike extends Vehicle {
    @XStreamAlias("vehicleattribute")
    String bikeAttribute;
}

Затем некоторая конфигурация XStream:

    XStream xstream = new XStream();
    xstream.processAnnotations(Car.class);
    xstream.processAnnotations(Bike.class);
    xstream.processAnnotations(Vehicle.class);

Создайте несколько транспортных средств и сообщите XStream XML'em.

    System.out.println(xstream.toXML(v1));
    System.out.println(xstream.toXML(v2));

Вот вывод, который вы хотите:

<car>
  <carattribute>my car</carattribute>
</car>
<bike>
  <vehicleattribute>my bike</vehicleattribute>
</bike>
...