Pregunta

Estoy aprendiendo XML / XSD y estoy luchando con la implementación de un esquema XML que modela una estructura de carpetas. Lo que tenía en mente era definir un complexType para la carpeta que puede tener instancias de carpetas adicionales que representan las subcarpetas. El uso de los esquemas XSD validador aquí devuelve siempre que el esquema no es válido.

He intentado definir el tipoCompuesto por adelantado y presionando el ref palabra clave para las subcarpetas:

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

Como para el propio elemento:

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

El error devuelto por el validador es:

"No se puede resolver el nombre de 'Carpeta' a un (a) 'declaración de elemento' componente."

y el error se produce en la línea

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

Definición de la complexType dentro del elemento en sí produce exactamente el mismo error:

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

Lo que yo he leído, este tipo de recursión debe trabajar utilizando ref .

Puede alguien decirme lo que he hecho mal? Tal vez el validador xsd es defectuoso? Si es así, ¿alguien sabe una mejor alternativa? He intentado usar el de w3.org así, pero parece que desconectarse ...

¿Fue útil?

Solución

creo que esta es la manera de hacerlo (no utilice ref):

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

<complexType name="TestType">
    <sequence>
        <element name="test" type="tns:TestType"></element>
    </sequence>
</complexType>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top