XSD模式和JAXB类中的多态性
我有这样一个xml:XSD模式和JAXB类中的多态性,xsd,jaxb,Xsd,Jaxb,我有这样一个xml: <todo> <doLaundry cost="1"/> <washCar cost="10"/> <tidyBedroom cost="0" experiencePoints="5000"/> </todo> public class Todo { public List<Object> getDoLaundryOrWashCarOrTidyBedroom() {
<todo>
<doLaundry cost="1"/>
<washCar cost="10"/>
<tidyBedroom cost="0" experiencePoints="5000"/>
</todo>
public class Todo {
public List<Object> getDoLaundryOrWashCarOrTidyBedroom() {
...
}
}
它的XSD模式是:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="todo">
<xs:sequence>
<xs:choice maxOccurs="unbounded">
<xs:element name="doLaundry" type="doLaundry" />
<xs:element name="washCar" type="washCar" />
<xs:element name="tidyBedroom" type="tidyBedroom" />
</xs:choice>
</xs:sequence>
</xs:complexType>
<xs:complexType name="doLaundry">
<xs:attribute name="cost" type="xs:int" />
</xs:complexType>
<xs:complexType name="washCar">
<xs:attribute name="cost" type="xs:int" />
</xs:complexType>
<xs:complexType name="tidyBedroom">
<xs:attribute name="cost" type="xs:int" />
<xs:attribute name="experiencePoints" type="xs:int" />
</xs:complexType>
</xs:schema>
当我通过JAXB处理这个模式时,我得到一个类,其方法如下:
<todo>
<doLaundry cost="1"/>
<washCar cost="10"/>
<tidyBedroom cost="0" experiencePoints="5000"/>
</todo>
public class Todo {
public List<Object> getDoLaundryOrWashCarOrTidyBedroom() {
...
}
}
公共类待办事项{
公共列表GetDolaundryorWashcarortidyDombery(){
...
}
}
理想情况下,我想要的是一种定义所有其他XSD类型都可以扩展的通用基类型的方法。从XSD模式生成的Jaxb类应该有一个返回通用任务列表的方法。这样可以很容易地将新任务添加到待办事项列表中:
public class Todo {
public List<Task> getTasks() {
...
}
}
public abstract class Task {
public int getCost() {
...
}
}
public class TidyBedroom extends Task {
public int getExperiencePoints() {
...
}
}
公共类待办事项{
公共列表getTasks(){
...
}
}
公共抽象类任务{
公共int getCost(){
...
}
}
公共类TidyBedroom扩展任务{
公共int getExperiencePoints(){
...
}
}
要生成上述Java类,XSD模式应该是什么样子?XSD:choice对应于@XmlElements注释。可以将此注释直接应用于所需的对象模型 有关更多信息,请参阅:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="todo">
<xs:sequence>
<xs:choice maxOccurs="unbounded">
<xs:element name="doLaundry" type="task" />
<xs:element name="washCar" type="task" />
<xs:element name="tidyBedroom" type="task" />
</xs:choice>
</xs:sequence>
</xs:complexType>
<xs:complexType name="task">
<xs:attribute name="cost" type="xs:int" />
<xs:attribute name="experiencePoints" type="xs:int" />
</xs:complexType>
</xs:schema>
我在Blaise Doughan的文章中找到了答案: 此模式:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="todo">
<xs:sequence>
<xs:choice maxOccurs="unbounded">
<xs:element name="doLaundry" type="doLaundry" />
<xs:element name="washCar" type="washCar" />
<xs:element name="tidyBedroom" type="tidyBedroom" />
</xs:choice>
</xs:sequence>
</xs:complexType>
<xs:complexType abstract="true" name="Task">
<xs:attribute name="cost" type="xs:int" use="required" />
</xs:complexType>
<xs:complexType name="doLaundry">
<xs:complexContent>
<xs:extension base="Task">
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="washCar">
<xs:complexContent>
<xs:extension base="Task">
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="tidyBedroom">
<xs:complexContent>
<xs:extension base="Task">
<xs:attribute name="experiencePoints" type="xs:int" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
与绑定文件结合使用:
<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:bindings>
<jxb:bindings schemaLocation="todo.xsd" node="/xs:schema/xs:complexType[@name='todo']/xs:sequence/xs:choice">
<jxb:property name="Tasks"/>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
将给出我在问题中描述的抽象类和继承类。绑定文件会将Jaxb的默认方法名从getDolaunDryorWashCarortidyDormoy()更改为getTask()。我想我的问题在一开始还不够清楚。我从XSD模式开始,希望通过JAXB从XSD模式生成Java类。我想知道XSD的结构是否可以提供所需的Java对象模型,而不是相反。您可以在XML模式中定义类型之间的继承关系。查看本文中的示例:给定此模式,Jaxb将不会生成我在问题中显示的类层次结构。它将创建一个单独的类“Task”,在对xml进行解组后,将无法区分Task的一个实例和另一个实例。例如,除了成本之外,doLaundry和washCar任务对象之间没有区别。