Yo, soy asin Yo en el universo
El Weblog de ese insignificante ser llamado David Bonilla
M2012

20050111 Tuesday January 11, 2005

Recursividad en Schemas XML
Los schemas XML se han convertido en una herramienta de desarrollo imprescindible. No solo se utilizan para validar XML sino que, bien estructuradas y documentadas, sirven para comprender en un solo vistazo funcionalidades y/o modulos enteros.

Al definir nuestros schemas, podemos encontrarnos con la necesidad de definir una recursividad que se puede producir en nuestros XML. Por ejemplo, imaginemos un Departamento de una empresa que, a su vez, esta compuesto de n Departamentos y estos de otros a su vez hasta el infinito. ¿Como podemos definir esto en un schema?.
A continuacion se muestra un sencillo ejemplo.

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="empresa">
        <xs:annotation>
            <xs:documentation>Comment describing your root element</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element name="nombre" type="xs:string"/>
                <xs:element name="departamentos" minOccurs="0">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="departamento" type="departamento" maxOccurs="unbounded"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="departamento">
        <xs:sequence>
            <xs:element name="nombre" type="xs:string"/>
            <xs:element name="numeroTrabajadores" type="xs:int"/>
            <xs:element name="subdepartamentos" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="departamento" type="departamento" maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

Si os fijais en el anterior schema, podreis observar que ademas del nodo raiz del schema, llamado empresa, esta definido otro elemento a parte denominado departamento.

    <xs:complexType name="departamento">
        <xs:sequence>
            <xs:element name="nombre" type="xs:string"/>
            <xs:element name="numeroTrabajadores" type="xs:int"/>
            <xs:element name="subdepartamentos" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="departamento" type="departamento" maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>


Una vez definido este elemento complejo podemos utilizarlo tantas veces como queramos dentro de la definicion del elemento/nodo principal asi como dentro de si mismo lo unico que hay que hacer es, al definir un elemento dentro de otro, especificar que es de tipo departamento.

Ej.

<xs:sequence>

    <xs:element name="departamento" type="departamento" maxOccurs="unbounded"/>
</xs:sequence>

Quizas entendais mejor el concepto teniendo una representacion visual de este schema.


Departamento
Empresa

Con esta representacion visual, es facil entender como este esquema representa recursividad a nivel de departamento. Si validarais un XML contra schema, observarias como el nivel de la recursividad es ilimitado.

(2005-01-11 09:02:29.0) Permalink Comentarios [2]


Archivos
Busca en el weblog
Navegacion
  Get Firefox
   Bitacoras.com
De donde venis