récursion XSD de complexTypes
-
21-09-2019 - |
Question
Je suis en train d'apprendre XML / XSD et je luttais avec la mise en œuvre d'un schéma XML qui modélise une structure de dossier. Ce que j'avais à l'esprit consiste à définir complexType pour le dossier qui peut avoir des instances de dossiers supplémentaires qui représentent les sous-dossiers. En utilisant le schéma xsd validateur renvoie toujours que le schéma est incorrect.
J'ai essayé de définir la complexType avant et puis en utilisant la ref mot-clé pour les sous-dossiers:
<xs:complexType name="tFolder">
<xs:sequence>
<xs:element name="Path" type="tFolderType" msdata:Ordinal="0" />
<xs:element ref="Folder" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="File" nillable="true" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent msdata:ColumnName="File_Text" msdata:Ordinal="0">
<xs:extension base="xs:string">
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="Type" type="tFolderType" />
En ce qui concerne l'élément lui-même:
<xs:element name="Folder" type="tFolder" />
L'erreur renvoyée par le validateur est:
"ne peut pas résoudre le nom 'dossier' à un (n) 'déclaration d'élément' composant".
et l'erreur se produit sur la ligne
<xs:element ref="Folder" minOccurs="0" maxOccurs="unbounded" />
Définir le complexType dans l'élément lui-même donne exactement la même erreur:
<xs:element name="Folder">
<xs:complexType>
<xs:sequence>
<xs:element name="Path" type="tFolderType" msdata:Ordinal="0" />
<xs:element ref="Folder" minOccurs="0" maxOccurs="unbounded" />
<xs:element name="File" nillable="true" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:simpleContent msdata:ColumnName="File_Text" msdata:Ordinal="0">
<xs:extension base="xs:string">
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="Type" type="tFolderType" />
</xs:complexType>
</xs:element>
Ce que j'ai lu, ce genre de récursion devrait travailler avec ref .
Quelqu'un peut-il me dire ce que je l'ai fait de mal? Peut-être que le validateur xsd est juste défectueuse? Si oui, est-ce que quelqu'un sait une meilleure alternative? Je l'ai essayé d'utiliser l'un de w3.org aussi, mais il semble être mis hors ligne ...
La solution
Je pense que c'est la façon de le faire (ne pas utiliser ref):
<element name="test" type="tns:TestType"></element>
<complexType name="TestType">
<sequence>
<element name="test" type="tns:TestType"></element>
</sequence>
</complexType>