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>