Java XJC xs:选择继承

Java XJC xs:选择继承,java,jaxb,xsd,jaxb2,xjc,Java,Jaxb,Xsd,Jaxb2,Xjc,我在让xjc生成一个具有选项组扩展名的类以维护顺序时遇到问题。下面的模式就是一个例子 <xs:complexType name="base"> <xs:choice maxOccurs="unbounded"> <xs:element name="a" /> <xs:element name="b" /> </xs:choice> </xs:complexType> <xs:complexTy

我在让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>


我尝试在my binding.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>

我已尝试使用上述xmlschema在上验证以下文件,它可以正常工作:

<?xml version="1.0" encoding="ISO-8859-1"?>
<extended>
  <a />
  <c />
  <b />
</extended>


好的,我也走了这条路,但我错误地认为我的xsd是有效的,但是我不知道扩展时有一个隐式序列,使得or之后无效。但是问题仍然存在,我确实需要保留扩展名,并让xjc将它们写入相同的列表属性。虽然Jerome的答案更正了我的xsd,使其有效,但我仍然在寻找一个答案,让子项的选择覆盖xjc中的父项