2

我需要使用 XStream 将受 XSD 约束的 XML 映射到 Java 对象。XSD 有 4 个复杂类型元素,它们是“选择”元素,即这 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 根的这种“选择”元素?因此,所有 4 个(即卡车、汽车、自行车、拖拉机)都可以作为关联实体进入 Wrapper,但 XStream 始终忽略除一个关联之外的所有关联,因此创建了一个 XSD 兼容的 XML。

希望我的问题很清楚。

非常感谢!

4

2 回答 2

0

这是解决方案:

车辆等级:

公共类车辆 { @XStreamAlias("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>
于 2010-10-06T16:37:41.223 回答
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 和 XStream 的比较,请参阅:

于 2010-10-09T16:57:24.353 回答