Xsd 没有类型定义的Marshall抽象类

Xsd 没有类型定义的Marshall抽象类,xsd,abstract-class,jaxb2,Xsd,Abstract Class,Jaxb2,我试图达到相反的目的。我有一个抽象类,但我不希望输出抽象类的类型和标记。所以我需要一个输出,它基本上看起来像 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <dokument ausgabe="ausgabe_test.doc" vorlage="vorlage_test.dot"> <marke typ="text" name="test"> <text>T

我试图达到相反的目的。我有一个抽象类,但我不希望输出抽象类的类型和标记。所以我需要一个输出,它基本上看起来像

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<dokument ausgabe="ausgabe_test.doc" vorlage="vorlage_test.dot">
    <marke typ="text" name="test">
        <text>This is a test</text>
    </marke>
</dokument>

基于您提供的模式,我想说以下几点:请记住,XML模式中复杂类型的继承与Java中的继承并不完全相同

在模式/对象模型中,您有一个继承自它的类型
inhalt
,还有一个类型
text
<代码>inhalt是抽象的。到目前为止,一切顺利。不同之处在于类型的用法。将类型
inhalt
分配给名为
inhalt
元素。这意味着只有alt中的元素
可以出现在那里,而不是
text
,并且xsi:type重写是指示正在使用哪个子类型所必需的(解析器无法猜到它)

如果使用替换组除了子类型之外,还可以实现您想要实现的目标,这将允许显示元素
文本
。重构架构,如下所示:

  • 创建一个名为“inhalt”的全局元素,并键入“inhalt”(如果您认为这有点混淆,请将类型名改为大写)
  • 创建名为“text”并键入“text”的全局元素。将“text”的替换组属性设置为“inhalt”
  • 将“marke”中的局部元素引用替换为全局元素引用
  • 以下是
    marke
    的新模型供参考:

    <xs:element name="inhalt" type="inhalt"/>
    <xs:element name="text" type="text" substitutionGroup="inhalt"/>
    <xs:complexType name="marke">
        <xs:sequence>
            <xs:element ref="inhalt"/>
        </xs:sequence>
        <xs:attribute name="name" type="xs:string" use="required"/>
        <xs:attribute name="typ" type="markenTyp" use="required"/>
    </xs:complexType>
    
    
    

    在此之后,
    text
    可以出现在
    marke

    中。根据您提供的模式,我想说以下几点:记住,XML模式中复杂类型的继承与Java中的继承并不完全相同

    在模式/对象模型中,您有一个继承自它的类型
    inhalt
    ,还有一个类型
    text
    <代码>inhalt
    是抽象的。到目前为止,一切顺利。不同之处在于类型的用法。将类型
    inhalt
    分配给名为
    inhalt
    元素。这意味着只有alt中的元素
    可以出现在那里,而不是
    text
    ,并且xsi:type重写是指示正在使用哪个子类型所必需的(解析器无法猜到它)

    如果使用替换组除了子类型之外,还可以实现您想要实现的目标,这将允许显示元素
    文本
    。重构架构,如下所示:

  • 创建一个名为“inhalt”的全局元素,并键入“inhalt”(如果您认为这有点混淆,请将类型名改为大写)
  • 创建名为“text”并键入“text”的全局元素。将“text”的替换组属性设置为“inhalt”
  • 将“marke”中的局部元素引用替换为全局元素引用
  • 以下是
    marke
    的新模型供参考:

    <xs:element name="inhalt" type="inhalt"/>
    <xs:element name="text" type="text" substitutionGroup="inhalt"/>
    <xs:complexType name="marke">
        <xs:sequence>
            <xs:element ref="inhalt"/>
        </xs:sequence>
        <xs:attribute name="name" type="xs:string" use="required"/>
        <xs:attribute name="typ" type="markenTyp" use="required"/>
    </xs:complexType>
    
    
    

    在这之后,
    text
    可能会出现在
    marke

    中,因为您没有包含架构,所以评论起来有点棘手。原则上,您不能序列化抽象元素或类型,因为这是非法的…我的模式是生成的,所以我认为它不会那么有趣。我把它添加到了我的初始问题中。你没有包含模式,所以评论起来有点棘手。原则上,您不能序列化抽象元素或类型,因为这是非法的…我的模式是生成的,所以我认为它不会那么有趣。我把它添加到我的第一个问题中。非常感谢。尽管如此,我仍然需要阅读关于替代组的文章来理解它们。非常感谢。尽管如此,我仍然需要阅读关于替代组的文章来理解它们。
    <xs:element name="inhalt" type="inhalt"/>
    <xs:element name="text" type="text" substitutionGroup="inhalt"/>
    <xs:complexType name="marke">
        <xs:sequence>
            <xs:element ref="inhalt"/>
        </xs:sequence>
        <xs:attribute name="name" type="xs:string" use="required"/>
        <xs:attribute name="typ" type="markenTyp" use="required"/>
    </xs:complexType>