注:私はEclipseLink JAXB (MOXy)リードとJAXB 2 (JSR-222)専門家グループのメンバーです。
EclipseLink JAXB(MOXy)の@XmlDescriminatorNode
/@XmlDescriminatorValue
拡張を使用して、このユースケースをマップできます。
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
車:
jaxb.properties
あなたのJAXBプロバイダとしてMOXYを指定するには、次のエントリを使用して、ドメインクラスと同じパッケージにjaxb.properties
というファイルをインクルードする必要があり
例では、継承インジケーターとしてカスタムノードを使用しています。 MOXyの@XmlDescriminatorNode
拡張子を使用してname
属性としてマップすることができます。 @XmlSeeAlso
アノテーションを使用して、すべてのサブタイプを指定します。私たちが継承指標を示す値を指定する必要がサブクラスのそれぞれに
package forum9812778;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlDiscriminatorNode;
@XmlRootElement
@XmlDiscriminatorNode("@name")
@XmlSeeAlso({BMW.class,Honda.class,Lexus.class,VW.class})
public class Car {
private String engine;
public String getEngine() {
return engine;
}
public void setEngine(String engine) {
this.engine = engine;
}
}
BMW
。これは、MOXyの@XmlDescriminatorValue
注釈を使用して行われます。
package forum9812778;
import org.eclipse.persistence.oxm.annotations.XmlDiscriminatorValue;
@XmlDiscriminatorValue("BMW")
public class BMW extends Car {
}
車
私たちは、ツリーのルートノードを表すオブジェクトを必要としています。私たちは、この役割を果たすために車のクラスを定義します:詳細情報
の場合
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"?>
<cars>
<car name="BMW"/>
<car name="Lexus"/>
<car name="VW"/>
<car name="Honda"/>
</cars>
を
あなたは全くトンのJAXBを見たことがありますか?これは、XMLオブジェクトをJavaオブジェクトにバインドするための標準ライブラリです(逆も同様です)。 –