我需要使用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。
希望我的问题很明确。
非常感谢!
答案 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见: