2010-08-21 7 views
3

J'ai une spécification XML qui ressemble à ceci:Comment créer un schéma pour les types composites?

<Root> 
    <Directory Name="SomeName"> 
     <TextFile Name="ExampleDocument.txt>This is the content of my sample text file.</TextFile> 
     <Directory Name="SubDirectory"> 
      <Speech Name="Example Canned Speech"> 
       ... 
      </Speech> 
     </Directory> 
    </Directory> 
</Root> 

Notez que Directory éléments peuvent contenir d'autres éléments Directory. Comment puis-je représenter cela en utilisant W3C Schema?

Répondre

2

Vous devez créer un <complexType> récursive pour représenter votre type <Directory> . Voici un exemple de cette technique, compte tenu des éléments que vous avez fournis.

<xs:complexType name="DirectoryType"> 
    <xs:sequence> 
     <xs:element name="TextFile"/> 
     <xs:element name="Speech"/> 
     <xs:element name="Directory" type="DirectoryType"/> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:element name="Root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Directory" type="DirectoryType" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
+0

Cocher cette réponse parce qu'elle fait le mieux pour expliquer clairement ce que je dois faire dans le cas général. –

2

Cela devrait le faire (vous pouvez limiter les noms plus que de xs:string):

<?xml version="1.0" encoding="utf-8"?> 
<!-- Remember to change namespace name with your own --> 
<xs:schema 
    targetNamespace="http://tempuri.org/XMLSchema1.xsd" 
    elementFormDefault="qualified" 
    xmlns="http://tempuri.org/XMLSchema1.xsd" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Root" type="Container"/> 

    <xs:element name="Directory" > 
    <xs:complexType> 
     <xs:complexContent> 
     <xs:extension base="Container"> 
      <xs:attribute name="Name" type="xs:string" use="required"/> 
     </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="TextFile"> 
    <xs:complexType> 
     <xs:simpleContent> 
     <xs:extension base="xs:string"> 
      <xs:attribute name="Name" use="required"/> 
     </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 
    </xs:element> 

    <xs:complexType name="Container"> 
     <xs:choice minOccurs="0" maxOccurs="unbounded"> 
     <xs:element ref="Directory"/> 
     <xs:element ref="TextFile"/> 
     </xs:choice> 
    </xs:complexType> 
</xs:schema> 

Testé sur:

<?xml version="1.0" encoding="utf-8" ?> 
<Root xmlns="http://tempuri.org/XMLSchema1.xsd"> 
    <Directory Name="SomeName"> 
    <TextFile Name="ExampleDocument.txt">This is the content of my sample text file.</TextFile> 
    <Directory Name="SubDirectory"> 
    </Directory> 
    <TextFile Name="hej"> 

    </TextFile> 
    </Directory> 
    <TextFile Name="file.txt"/> 
</Root> 
+0

+1 pour la réponse la plus complète. Merci beaucoup. –

Questions connexes