Tutoriales de informática - Abrirllave.com

Abrirllave.com

Indicadores en XSD (XML Schema)

Los indicadores permiten establecer cómo se van a escribir –o utilizar– los elementos en un documento XML. Hay siete tipos de indicadores que se pueden clasificar en:

Indicadores de orden (xs:sequence, xs:all, xs:choice)

Mientras que xs:sequence sirve para especificar el orden en el que obligatoriamente deben aparecer los elementos hijo de un elemento, xs:all sirve para indicar que dichos elementos pueden aparecer en cualquier orden.

EJEMPLO El siguiente archivo "lugar.xsd":

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="lugar">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="ciudad">
          <xs:complexType>
            <xs:all>
              <xs:element name="nombre" type="xs:string"/>
              <xs:element name="pais" type="xs:string"/>
            </xs:all>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Permite validar el siguiente documento XML:

<?xml version="1.0" encoding="UTF-8"?>
<lugar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="lugar.xsd">
   <ciudad>
      <pais>Italia</pais>
      <nombre>Florencia</nombre>
   </ciudad>
</lugar>

Por otra parte, xs:choice sirve para especificar que solamente se permite escribir uno de los elementos hijo. Por ejemplo, en este caso, se podría utilizar para indicar que habría que elegir entre escribir el "nombre" o escribir el "país" de la "ciudad", pero no ambos.

Indicadores de ocurrencia (maxOccurs, minOccurs)

maxOccurs y minOccurs permiten establecer, respectivamente, el número máximo y mínimo de veces que puede aparecer un determinado elemento. El valor por defecto para maxOccurs y minOccurs es 1.

EJEMPLO Dado el siguiente documento XML "paises.xml":

<?xml version="1.0" encoding="UTF-8"?>
<paises xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="paises.xsd">
   <pais>
      <nombre>Argentina</nombre>
      <ciudad>Buenos Aires</ciudad>
      <ciudad>Rosario</ciudad>
   </pais>
   <pais>
      <nombre>México</nombre>
      <ciudad>Guadalajara</ciudad>
      <ciudad>Monterrey</ciudad>
      <ciudad>Cancún</ciudad>
      <ciudad>Mérida</ciudad>
      <ciudad>Ciudad de México</ciudad>
   </pais>
   <pais>
      <nombre>Colombia</nombre>
   </pais>
</paises>

Considerando que se quiere especificar que:

El código del archivo "paises.xsd" que permita validar "paises.xml", podría ser:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="paises">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="pais" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="nombre" type="xs:string"/>
              <xs:element name="ciudad" type="xs:string"
                          minOccurs="0" maxOccurs="5"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Indicadores de grupo (xs:group, xs:attributeGroup)

xs:group sirve para agrupar un conjunto de declaraciones de elementos relacionados.

EJEMPLO Dado el siguiente documento XML "personas.xml":

<?xml version="1.0" encoding="UTF-8"?>
<personas xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="personas.xsd">
   <persona>
      <nombre>Eva</nombre>
      <edad>25</edad>
      <pais>Francia</pais>
      <telefono>999888777</telefono>
   </persona>
   <persona>
      <nombre>Giovanni</nombre>
      <edad>26</edad>
      <pais>Italia</pais>
      <telefono>111222333</telefono>
   </persona>
</personas>

Y el archivo "personas.xsd" que permite validarlo:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="personas">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="persona" type="datosDePersona"
                    maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="datosDePersona">
    <xs:sequence>
      <xs:group ref="datosBasicos"/>
      <xs:element name="telefono" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>

  <xs:group name="datosBasicos">
    <xs:sequence>
      <xs:element name="nombre" type="xs:string"/>
      <xs:element name="edad" type="xs:positiveInteger"/>
      <xs:element name="pais" type="xs:string"/>
    </xs:sequence>
  </xs:group>

</xs:schema>

Del mismo modo, attributeGroup sirve para definir un grupo de atributos. Por ejemplo, para validar el siguiente documento XML:

<?xml version="1.0" encoding="UTF-8"?>
<personas xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="personas.xsd">
   <persona nombre="Eva" edad="25" pais="Francia"/>
   <persona nombre="Giovanni" edad="26" pais="Italia"/>
</personas>

Se puede escribir el siguiente código en el archivo "personas.xsd":

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="personas">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="persona" maxOccurs="unbounded">
          <xs:complexType>
            <xs:attributeGroup ref="datosDePersona"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:attributeGroup name="datosDePersona">
    <xs:attribute name="nombre" type="xs:string"/>
    <xs:attribute name="edad" type="xs:positiveInteger"/>
    <xs:attribute name="pais" type="xs:string"/>
  </xs:attributeGroup>

</xs:schema>
Ejercicios resueltos