您可以通过服用XmlAdapter
的优势,使用任何JAXB (JSR-222)映射这种使用情况:
CarAdapter
在你的榜样,你正在使用的继承指标自定义节点。使用标准的JAXB API,我们可以使用XmlAdapter
来映射这个用例。 XmlAdapter
将域对象转换为JAXB实现(Metro,MOXy,JaxMe等)更易于映射的对象。
package forum9812778;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class CarAdapter extends XmlAdapter<CarAdapter.AdaptedCar, Car> {
@Override
public AdaptedCar marshal(Car car) throws Exception {
AdaptedCar adaptedCar = new AdaptedCar();
adaptedCar.name = car.getClass().getSimpleName();
adaptedCar.engine = car.getEngine();
return adaptedCar;
}
@Override
public Car unmarshal(AdaptedCar adaptedCar) throws Exception {
Car car;
if("BMW".equals(adaptedCar.name)) {
car = new BMW();
} else if("Lexus".equals(adaptedCar.name)) {
car = new Lexus();
} else if("VW".equals(adaptedCar.name)) {
car = new VW();
} else if("Honda".equals(adaptedCar.name)) {
car = new Honda();
} else {
return null;
}
car.setEngine(adaptedCar.engine);
return car;
}
public static class AdaptedCar {
@XmlAttribute
public String name;
@XmlAttribute
public String engine;
}
}
汽车
的@XmlJavaTypeAdapter
注释用于将XmlAdapter
与Car
类关联:
package forum9812778;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement
@XmlJavaTypeAdapter(CarAdapter.class)
public class Car {
private String engine;
public String getEngine() {
return engine;
}
public void setEngine(String engine) {
this.engine = engine;
}
}
BMW
下面是中的一个的一个例子子类。
package forum9812778;
public class BMW extends Car {
}
汽车
我们需要一个Object
来表示我们的树的根节点。我们将定义Cars
类担任这个角色:
package forum9812778;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Cars {
private List<Car> car;
public List<Car> getCar() {
return car;
}
public void setCar(List<Car> car) {
this.car = car;
}
}
演示
package forum9812778;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Cars.class);
File xml = new File("src/forum9812778/input.xml");
Unmarshaller unmarshaller = jc.createUnmarshaller();
Cars cars = (Cars) unmarshaller.unmarshal(xml);
for(Car car : cars.getCar()) {
System.out.println(car.getClass());
}
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(cars, System.out);
}
}
输出
class forum9812778.BMW
class forum9812778.Lexus
class forum9812778.VW
class forum9812778.Honda
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cars>
<car engine="2.5" name="BMW"/>
<car engine="4.5" name="Lexus"/>
<car engine="1.4" name="VW"/>
<car engine="2.0" name="Honda"/>
</cars>
更多信息
有你看牛逼JAXB呢?它是将XML绑定到Java对象的标准库(反之亦然)。 – 2012-03-21 21:02:20