2010-08-30 72 views
1

我试图达到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

您没有包含架构,因此评论有点棘手。原则上,你不能序列化一个抽象的元素或类型,因为这是非法的... – xcut 2010-08-31 08:21:29

+0

我的模式生成了,所以我认为它不会那么有趣。我将它添加到我最初的问题中。 – Jan 2010-08-31 12:34:44

回答

1

根据您所提供的模式,我下面会说:记住复杂类型的XML Schema的是继承不是正是你所期望的在Java中的相同。

在您的模式/对象模型中,您有一个类型inhalt和从中继承的text类型。 inhalt是抽象的。到现在为止还挺好。区别在于的用法的类型。您将类型inhalt分配给称为inhalt元素。这意味着只有元素inhalt可以出现在那里,而不是text,并且需要使用xsi:type覆盖来指示正在使用哪个子类型(解析器无法猜测它)。

如果您使用替代组以及子分型,则可以实现想要实现的目标,这将允许出现元素text。重构架构如下:

  1. 创建名为“inhalt”全局元素,并键入“inhalt”(使类型名称上的情况下,如果你认为这是混淆)
  2. 创建名为全局元素“文本”并键入“文本”。将“text”的替换组属性设置为“inhalt”。
  3. 将“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出现。

+0

非常感谢。尽管如此,我仍然需要阅读有关替换组的内容才能理解它们。 – Jan 2010-09-03 10:56:43