2

XSD によって制約された XML を、XStream を使用して Java オブジェクトにマップする必要があります。XSD には、「選択」要素である 4 つの複合型要素があり、これら 4 つのいずれかがルート タグの下の XML に存在できます。

私は XStream を見てきましたが、そのような XML をマップするには、8 つのクラスが必要になるようです。どのように?ここにあります...

たとえば、私のルート要素が VEHICLE で、XML の各複合型が a) CAR b) BIKE c) TRUCK d) TRACTOR であるとします。それらのそれぞれは、その中に異なる特性を持っています。これを Xstream にマップし、(XStream によって生成された) XML を XSD に準拠させるには、8 つのクラスが必要になります。VehicleCarWrapper -> (ある) CarVehicleTruckWrapper -> (ある) TruckVehicleBikeWrapper -> (ある) BikeおよびVehicleTractorWrapper -> (ある) Tractor

ぼろぼろの解決策とは別に、誰か提案がありますか? XMLルートのそのような「選択」された要素をXstreamにマップする方法はありますか? そのため、4 つすべて (つまり、トラック、自動車、自転車、トラクター) は関連付けられたエンティティとして Wrapper に入ることができますが、XStream は常に 1 つの関連付けを除くすべてを無視するため、XSD 準拠の XML を作成します。

私の質問が明確であることを願っています。

どうもありがとう!

4

2 に答える 2

0

解決策は次のとおりです。

車両クラス:

public class Vehicle { @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 に伝えます。

    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 に答える