我正在使用jaxb插件(rg.jvnet.jaxb2.maven2)来生成我的java类。所以,我正在使用自动生成java类的xsd。我希望我的解决方案是抽象的。
我有一个XML
<RESULTS>
<RESULT>
<TOKEN>XXXXXXXXXXXXXXXXXXXXXXXXX</TOKEN>
<LANGUAGE>en</LANGUAGE>
<SEARCHTYPE>PO</SEARCHTYPE>
</RESULT>
</RESULTS>
稍后,我将为其他产品提供相同的XML,但需要额外的NUMBER元素
<RESULTS>
<RESULT>
<TOKEN>XXXXXXXXXXXXXXXXXXXXXXXXX</TOKEN>
<LANGUAGE>en</LANGUAGE>
<SEARCHTYPE>PO</SEARCHTYPE>
<NUMBER>123456789</NUMBER>
</RESULT>
</RESULTS>
我想让我的解决方案变得抽象。下面是我的jaxb实现。
1)我的结果类包含结果列表。我把这个结果作为BaseResult。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "RESULTS", propOrder = {
"baseresult"
})
public class Results implements Equals2, HashCode2, ToString2
{
@XmlElement(name = "BASERESULT", required = true)
protected List<BaseResult> baseresult;
}
2)这是我的BaseResult类,它有公共字段。
公共抽象类BaseResult实现了Equals2,HashCode2,ToString2 {
@XmlElement(name = "TOKEN", required = true)
protected String token;
@XmlElement(name = "LANGUAGE", required = true)
protected String language;
}
这是我生成上面代码的xsd文件
<xs:complexType name="RESULTS">
<xs:annotation>
<xs:documentation>
Holds results tag <!-- <RESULTS></RESULTS> -->
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="BASERESULT" type="BASERESULT" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="BASERESULT" abstract="true">
<xs:annotation>
<xs:documentation>
Holds result <!-- <RESULT></RESULT> -->token , with all common elements in result tag
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="TOKEN" type="xs:string" />
<xs:element ref="LANGUAGE" type="xs:string"/>
</xs:sequence>
</xs:complexType>
3)这是结果的子类,它有子字段。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "RESULT", propOrder = {
"searchType"
})
public class Result extends BaseResult
implements Equals2, HashCode2, ToString2
{
@XmlElement(name = "SEARCHTYPE", required = true)
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
@XmlSchemaType(name = "NCName")
protected String searchType;
}
这是我生成上面代码的xsd文件
<xs:complexType name="RESULT">
<xs:complexContent>
<xs:extension base="BASERESULT">
<xs:sequence>
<xs:element ref="SEARCHTYPE" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
问题是我无法按上述方式制作我的xml。 它无法填充mu xml中的结果。
PLease建议
答案 0 :(得分:0)
你的问题来自:
@XmlElement(name = "BASERESULT", required = true)
protected List<BaseResult> baseresult;
这表明您希望在XML中找到BASERESULT元素。
切换到:
@XmlElement(name="result")
protected List<BaseResult> baseresult;
有了这个,你只会获得你的公共属性(或者因为BaseResult是抽象的错误)。
你的另一个问题是你有映射到哪个类JAXB应该绑定它找到的元素。
你应该使用的是这样的东西:
@XmlElements({
@XmlElement(name="result",type=Result.class),
@XmlElement(name="result2",type=Result2.class)
})
protected List<BaseResult> baseresult;
问题是你为你的班级使用相同的元素名称。 通常,XML元素只能由一个类描述,以便JAXB找到适当的绑定类。
因此,您应该在XML中为扩展BaseResult的每个类使用不同的元素名称。
如果你不能这样做,我没有看到任何可以根据你的意愿实现抽象解决方案的解决方法。