2010-09-17 121 views
2

我需要使用XStream將受XSD約束的XML映射到Java對象。 XSD具有4個複雜類型元素,它們是「選擇」元素,即這4個元素中的任何一個都可以存在於根標記下的XML中。Xstream映射XML的「選擇」元素

我一直在看XStream,但在我看來,要映射這樣的XML,我需要8個類。怎麼樣?這裏是...

說例如我的根元素是VEHICLE,並且XML中的每個複雜類型都是a)CAR b)BIKE c)卡車d)TRACTOR。他們每個人都有不同的屬性。爲了將其映射到Xstream並使XSD(由XStream生成)符合XSD,我們需要8個類即viz。 VehicleCarWrapper - >(有)汽車VehicleTruckWrapper - >(有)卡車VehicleBikeWrapper - >(有)自行車VehicleTractorWrapper - >(有)拖拉機

除了破舊的解決方案之外,有沒有人有建議? Xstream中有沒有一種方法可以映射XML根的這種「選擇」元素?因此,所有4(即卡車,汽車,自行車,拖拉機)都可以作爲關聯實體進入包裝器,但XStream始終忽略除一個關聯以外的所有關聯,因此創建符合XSD的XML。

希望我的問題很清楚。

非常感謝!

回答

0

下面是解:

Vehicle類:

公共類車輛{ @XStreamAlias( 「vehicleAttribute」) 字符串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> 
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的看到:

+0

有關使用JAXB映射選擇結構的詳細示例,請參閱:http://bdoughan.blogspot.com/2010/10/jaxb-and-xsd-choice-xmlelements.html – 2010-10-21 19:29:54