2010-08-30 71 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