2009-12-01 3 views
0

Je suit morceau de XML:Définir élément typé flexible dans XML-Schema

<items> 
    <item type="simple">some text</item> 
    <item type="complex"><b>other text</b></item> 
</items> 

je peux définir l'élément "item" avec DTD, comme:

<!ELEMENT item (#PCDATA|b)*> 

Comment puis-je définir avec XML Schema (XSD)?

Répondre

0

Les schémas XML ont ces types abstraits qui rendent cette chose assez facile tant que le préfixe xsi sur l'attribut type dans votre XML ne vous dérange pas. Vous pouvez définir ce que vous avez ci-dessus comme suit:

<!--items element--> 
    <xs:element name="items"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="item" maxOccurs="unbounded" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <!--individual item element--> 
    <xs:element name="item" type="item" /> 
    <!--make the item type abstract so you're forced to declare its type in the XML file--> 
    <xs:complexType name="item" abstract="true" /> 

    <!--declare your simple type - mixed content is so that you can have text in a complex type--> 
    <xs:complexType name="simple"> 
    <xs:complexContent mixed="true"> 
     <xs:extension base="item"> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 

    <!--declare your complex type--> 
    <xs:complexType name="complex"> 
    <xs:complexContent> 
     <xs:extension base="item"> 
     <!--define the stuff that can go into that complex element--> 
     <xs:sequence> 
      <xs:element name="b" type="xs:string" /> 
     </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
    </xs:complexType> 

Et votre XML résultant serait la suivante:

<items xmlns="your-namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <item xsi:type="simple">some text</item> 
    <item xsi:type="complex"> 
    <b>other text</b> 
    </item> 
</items> 
+0

Il fonctionne comme vous le suggérez. Très utile. Cette solution semble utiliser "type abstrait" pour définir un groupe d'éléments, ces éléments sont avec le même nom, mais le type de contenu différent. –

Questions connexes