XSD扩展类型,并在顶部和底部添加字段

XSD扩展类型,并在顶部和底部添加字段,xsd,jaxb,Xsd,Jaxb,我有以下XSD(为了问这个问题): 这允许XML文件如下所示: <extendedType> <field1>hello</field1> <field2>world</field2> <fieldA>aaa</fieldA> <fieldB>bbb</fieldB> </extendedType> 你好 世界 aaa bbb 也就是说,在BaseTy

我有以下XSD(为了问这个问题):


这允许XML文件如下所示:

<extendedType>
  <field1>hello</field1>
  <field2>world</field2>
  <fieldA>aaa</fieldA>
  <fieldB>bbb</fieldB>
</extendedType>

你好
世界
aaa
bbb
也就是说,在BaseType的底部添加了两个新闻字段fieldA和fieldB

有没有扩展基类型的方法, 但在顶部插入fieldA,在底部插入fieldB? 这么说这行得通

<extendedType>
  <fieldA>aaa</fieldA>
  <field1>hello</field1>
  <field2>world</field2>
  <fieldB>bbb</fieldB>
</extendedType>

aaa
你好
世界
bbb

如何使JAXB按预期工作?

更新

以下是XML模式规范中的相关语句:

2.2.1.3复杂类型定义()

扩展另一个类型的复杂类型通过具有额外的 另一个定义内容末尾的内容模型粒子 模型,或通过具有附加属性声明,或两者兼而有之


为了对XML模式有效,扩展字段需要出现在继承字段之后。取消编组时,元素可以按任意顺序排列。如果从POJO开始,可以标记父类
@xmltransive
,以便将父属性视为子属性的一部分,以便它们可以包含在子属性的
比例器中

了解更多信息

扩展另一个内容模型的复杂类型通过在另一个定义的内容模型末尾具有附加的内容模型粒子,或通过具有附加的属性声明,或两者兼而有之来实现

  • 注意:本规范只允许附加,不允许其他类型的扩展。此决策简化了将实例从派生类型强制转换为基类型所需的应用程序处理。未来的版本可能允许更多种类的扩展,需要更复杂的转换来实现强制转换
因此,在扩展类型时,字段仅添加在底部

黑客:扩展类型的字段出现在顶部。i、 e.添加到扩展类型的字段添加在顶部。因此,您可以有三个级别的类型:顶部“虚拟”级别(用于顶部字段)、中间级别(包含要继承的字段)和底部级别(用于底部字段)。导入此内容的架构将定义底层,并重新定义顶层。这将使您能够在顶部和底部添加字段。 这个问题的大问题是,它还将为扩展它的所有其他类型重新定义顶级。。。因此,这些额外的字段将出现在所有地方,这可能不是您想要的

其他替代方案包括:避免扩展机制,而是使用
替换组
(但这些需要不同的元素名称);或者在元素中创建自己的多态性(
)和继承性(
,在顶部和底部),但请注意,每个选择都必须唯一开始,否则就会违反UPA规则(因为它们不会通过属性来区分,如
xsi:type


编辑我看到另一个答案已经涵盖了这一点,我已经输入了所有这些,还有一些额外的建议,所以我还是保留它吧。

hi;您是否100%确定在继承字段之前不存在扩展字段?我正在阅读XSD规范,但我没有找到它说扩展字段必须出现在继承字段之后的地方。(我需要在XSD文件中声明BaseType,因此Java技巧在这里不起作用)@DavidPortabella-100%确定。我已经用XML模式规范中的相关段落更新了我的答案。@BlaiseDoughan您的URL的锚点(恰好也是另一节的有效锚点)的末尾有一个错误的“s”。是否有方法生成这些@XmlTransient和@XmlType(Propoder={…})注释/基类,什么时候从XSD开始?例如,使用绑定文件?您好,谢谢您提供的所有信息;很抱歉,stackoverflow只允许接受一个答案。
<extendedType>
  <fieldA>aaa</fieldA>
  <field1>hello</field1>
  <field2>world</field2>
  <fieldB>bbb</fieldB>
</extendedType>