我尝试与here相反。我有一个抽象类,但我不希望输出抽象类的类型和标记。所以我需要一个输出,基本上看起来像
<?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 version="1.0" encoding="UTF-8" standalone="yes"?>
<dokument ausgabe="ausgabe_test.doc" vorlage="vorlage_test.dot">
<marke typ="text" name="test">
<inhalt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="text">
<text>This is a test</text>
</inhalt>
</marke>
</dokument>
Text
继承自抽象类Inhalt
。
我当前(生成的)架构如下所示。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="dokument" type="dokument"/>
<xs:complexType name="dokument">
<xs:sequence>
<xs:element name="marke" type="marke" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="vorlage" type="xs:string" use="required"/>
<xs:attribute name="ausgabe" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="marke">
<xs:sequence>
<xs:element name="inhalt" type="inhalt"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="typ" type="markenTyp" use="required"/>
</xs:complexType>
<xs:complexType name="inhalt" abstract="true">
<xs:sequence/>
<xs:attribute name="style" type="xs:string"/>
</xs:complexType>
<xs:complexType name="text">
<xs:complexContent>
<xs:extension base="inhalt">
<xs:sequence>
<xs:element name="text" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:simpleType name="markenTyp">
<xs:restriction base="xs:string">
<xs:enumeration value="text"/>
<xs:enumeration value="tabelle"/>
<xs:enumeration value="liste"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
答案 0 :(得分:1)
根据您提供的模式,我会说以下内容:请记住,XML Schema中复杂类型的继承与完全相同与您在Java中所期望的相同。
在架构/对象模型中,您有一个类型inhalt
和一个继承自它的类型text
。 inhalt
是抽象的。到现在为止还挺好。不同之处在于类型的用法。您将类型inhalt
分配给名为inhalt
的元素。这意味着只有inhalt
元素可以出现在那里,而不是text
,并且需要xsi:type override来指示正在使用哪个子类型(解析器无法猜测它)。
如果您使用替换组以及子类型,您可以实现您想要实现的目标,这将允许元素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>
在此之后,text
可以显示在marke
内。