Domanda

Sono solo imparando XML / XSD e sto lottando con l'implementazione di un XML-schema che modella una struttura di cartelle. Quello che avevo in mente era definendo un complexType per la cartella che può avere istanze di cartelle aggiuntive che rappresentano le sottocartelle. Utilizzando il validatore schema XSD qui restituisce sempre che lo schema è valido.

Ho provato a definire il complexType in anticipo e quindi utilizzando il ref parola chiave per le sottocartelle:

<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" />

Per quanto riguarda l'elemento stesso:

<xs:element name="Folder" type="tFolder" />

L'errore restituito dal validatore è:

"Impossibile risolvere il nome 'Cartella' a un (n) 'dichiarazione dell'elemento' componente."

e l'errore si verifica in corrispondenza della linea

<xs:element ref="Folder" minOccurs="0" maxOccurs="unbounded" />

Definire il complexType all'interno dell'elemento stesso produce lo stesso errore esatto:

<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>

Quello che ho letto, questo tipo di ricorsione dovrebbe funzionare utilizzando ref .

Qualcuno può dirmi cosa ho fatto di sbagliato? Forse il validatore XSD è solo difettoso? Se è così, qualcuno sa un'alternativa migliore? Ho provato con quello da w3.org pure, ma sembra essere preso offline ...

È stato utile?

Soluzione

Credo che questo sia il modo per farlo (non usare ref):

<element name="test" type="tns:TestType"></element>

<complexType name="TestType">
    <sequence>
        <element name="test" type="tns:TestType"></element>
    </sequence>
</complexType>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top