我在让 xjc 生成一个具有维持顺序的选择组扩展的类时遇到问题。以下架构是一个示例。
<xs:complexType name="base">
<xs:choice maxOccurs="unbounded">
<xs:element name="a" />
<xs:element name="b" />
</xs:choice>
</xs:complexType>
<xs:complexType name="extended">
<xs:complexContent>
<xs:extension base="base">
<xs:choice>
<xs:element name="c" />
</xs:choice>
</xs:extension>
</xs:complexContent>
</xs:complexType>
问题是,这会导致基类和扩展类都包含列表属性,而不是扩展类仅添加到基列表属性,以便在以下 xml 的情况下可以保持顺序:
<extended>
<a />
<c />
<b />
</extended>
我尝试在绑定(bind).xjb 中手动将属性名称设置为相同,但由于命名冲突而出现提示。
最佳答案
在这里,您想要扩展可能的选择列表,而不是类型。为此,您应该使用如下模式:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="base">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:group ref="baseGroup"/>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="extended">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:group ref="extendedGroup"/>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:group name="baseGroup">
<xs:choice>
<xs:element name="a" />
<xs:element name="b" />
</xs:choice>
</xs:group>
<xs:group name="extendedGroup">
<xs:choice>
<xs:group ref="baseGroup" />
<xs:element name="c" />
</xs:choice>
</xs:group>
</xs:schema>
我尝试在 http://www.xmlvalidation.com/ 上验证以下文件使用上面的 xmlschema,它可以正常工作,不会出现错误:
<?xml version="1.0" encoding="ISO-8859-1"?>
<extended>
<a />
<c />
<b />
</extended>
关于java - XJC xs :choice inheritance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12290025/