Xstream映射XML的“选择”元素

时间:2010-09-17 12:23:24

标签: java xml-serialization xstream

我需要使用XStream将受XSD约束的XML映射到Java对象。 XSD有4个复杂类型元素,它们是“选择”元素,它们中的任何一个可以在根标记下的XML中出现。

我一直在关注XStream,但在我看来,要映射这样的XML,我需要8个类。怎么样?这是......

比如说我的根元素是VEHICLE,XML中的每个复杂类型都是a)CAR b)BIKE c)TRUCK d)TRACTOR。它们中的每一个都具有不同的属性。要将此映射到Xstream并使XML(由XStream生成)符合XSD,我们需要8个类即。 VehicleCarWrapper - > (有)汽车 VehicleTruckWrapper - > (有)卡车 VehicleBikeWrapper - > (有)自行车 VehicleTractorWrapper - > (有)拖拉机

除了破旧的解决方案,有没有人有任何建议?在Xstream中有没有办法映射XML根的这种“选择”d元素?因此,所有4(即卡车,汽车,自行车,拖拉机)都可以作为关联实体进入包装器,但XStream始终忽略除一个关联之外的所有关联,因此创建符合XSD的XML。

希望我的问题很明确。

非常感谢!

2 个答案:

答案 0 :(得分:0)

以下是解决方案:

车辆类:

公共类车辆{     @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>

答案 1 :(得分:0)

为什么不使用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&amp; XStream见: