Abr 282012
 

(Read this post in english)

XSD es un formato para definir la estructura de un documento XML. XSD sustituye al anterior formato DTD, y añade funcionalidad para definir la estructura XML con más detalle.

Ejemplo de documento XSD:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:element name="note">
   <xs:complexType>
     <xs:sequence>
       <xs:element name="to" type="xs:string"/>
       <xs:element name="from" type="xs:string"/>
       <xs:element name="heading" type="xs:string"/>
       <xs:element name="body" type="xs:string"/>
     </xs:sequence>
   </xs:complexType>
 </xs:element>
</xs:schema>

Como podemos ver, el propio documento XSD está también escrito en XML.

Cómo hacer referencia en un documento XML a su especificación XSD

Una vez escrita una especificación XSD, podemos puede escribir un documento XML, y hacer constar en el mismo que debe ser conforme a dicha especificación. Esto se hace añadiendo algunos atributos al elemento raíz del documento XML.

En el ejemplo siguiente, vemos un documento XML que es conforme a la especificación “note.xsd”  presentada más arriba:

<?xml version="1.0"?>
<note
xmlns="http://www.openalfa.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.openalfa.com note.xsd">
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

En la línea 3, indicamos que el “namespace” al que pertenecen los elementos que aparecen en el documento es “http://www.openalfa.com”

En la línea 4, indicamos que también pueden aparecer elementos del namespace “http://www.w3.org/2001/XMLSchema-instance”, y deben ir precedidos por el prefijo “xsi”.

En la línea 5, el atributo xsi:schemaLocation indica la ubicación del esquema XSD contra el que se debe validar el documento XML (En este caso un documento denominado “note.xsd”). Como vemos, este atributo utiliza el prefijo “xsi:”, y por lo tanto se trata de un atributo definido en el namespace de la línea 4.

 Elementos, atributos y tipos de datos simples

En el esquema se definen los elementos de que puede constar el documento XML, y los tipos de datos que pueden contener, mediante lineas de la forma:

<xs:element name="nombre_del_elemento" type="tipo_de_datos" />

Los tipos de datos más comunes son:

      • xs:string
      • xs:decimal
      • xs:integer
      • xs:boolean
      • xs:date
      • xs:time

Un elemento también puede tener atributos. Los atributos se definen igual que los elementos, sustituyendo xs:element por xs:attribute. Ejemplos:

<xs:attribute name="lang" type="xs:string" use="required"/>
<xs:attribute name="lang" type="xs:string" use="optional" default="es"/>

También podemos crear nuevos tipos de datos, estableciendo restricciones sobre los valores posibles de un tipo de datos predefinido. Ejemplos;

<xs:element name="age">
  <xs:simpleType>
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="120"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>
<xs:element name="car">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:enumeration value="Audi"/>
      <xs:enumeration value="Golf"/>
      <xs:enumeration value="BMW"/>
    </xs:restriction>
  </xs:simpleType>
</xs:element>

<xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="([a-z][A-Z])+"/>
</xs:restriction>
</xs:simpleType>
</xs:element>

Restricciones aplicables a tipos de datos simples

Constraint Description
enumeration Defines a list of acceptable values
fractionDigits Specifies the maximum number of decimal places allowed. Must be equal to or greater than zero
length Specifies the exact number of characters or list items allowed. Must be equal to or greater than zero
maxExclusive Specifies the upper bounds for numeric values (the value must be less than this value)
maxInclusive Specifies the upper bounds for numeric values (the value must be less than or equal to this value)
maxLength Specifies the maximum number of characters or list items allowed. Must be equal to or greater than zero
minExclusive Specifies the lower bounds for numeric values (the value must be greater than this value)
minInclusive Specifies the lower bounds for numeric values (the value must be greater than or equal to this value)
minLength Specifies the minimum number of characters or list items allowed. Must be equal to or greater than zero
pattern Defines the exact sequence of characters that are acceptable
totalDigits Specifies the exact number of digits allowed. Must be greater than zero
whiteSpace Specifies how white space (line feeds, tabs, spaces, and carriage returns) is handled

Tipos de Datos Compuestos

Se pueden definir tipos de datos compuestos mediante elementos <xs:complexType>. Los tipos de datos compuestos contienen un conjunto de tipos de datos simples o compuestos. Estos se pueden agrupar mediante indicadores de orden como <xs:sequence> y también pueden emplear indicadores de ocurrencia, como explicamos más adelante.

<xs:element name="employee" type="fullpersoninfo"/>

<xs:complexType name="personinfo">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="fullpersoninfo">
  <xs:complexContent>
    <xs:extension base="personinfo">
      <xs:sequence>
        <xs:element name="address" type="xs:string"/>
        <xs:element name="city" type="xs:string"/>
        <xs:element name="country" type="xs:string"/>
      </xs:sequence>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>

En el ejemplo de arriba podemos ver las definiciones de:

    • Un tipo compuesto denominado “personinfo”
    • Un tipo compuesto “fullpersoninfo”, definido como una extension del tipo “personinfo”. Esto se hace empleando los tags <xs:complexContent> y <xs:extension>.
    • Un elemento “employee” del tipo “fullpersoninfo”

Indicadores

Existen siete indicadores que pueden ser utilizados en la definición de un tipo compuesto.

Indicadores de orden:

    • <xs:all>…</xs:all>  – Los elementos que contiene pueden aparecer en cualquier orden.
    • <xs:choice>…</xs:choice> – Sólo puede aparecer uno de los elementos que contiene
    • <xs:sequence>…</xs:sequence> – Los elementos que contiene deben aparecer exactamente en el mismo orden en que están definidos

Indicadores de ocurrencia:

Por defecto, los elementos definidos como parte de un tipo compuesto deben aparecer exactamente una vez. Los atributos maxOccurs and minOccurs modifican este requisito:

    • maxOccurs=”n” – Atributo que indica que el elemento puede aparecer varias veces, hasta un máximo de “n” veces. Si especificamos maxOccurs=”unbounded”, el elemento puede aparecer un número indefinido de veces.
    • minOccurs=”n” – Atributo que indica que el elementos debe aparecer un mínimo de “n” veces. minOccurs=”0″, significa que el elemento es opcional, y puede no aparecer.

Indicadores de grupo:

    • Group name – Podemos definir y asignar un nombre a un grupo de elementos de la forma <xs:group name=”nombre_grupo”>…</xs:group>.
      Una vez definido, en la definición de un tipo de datos compuesto podemos hacer referencia al mismo utilizando la sintaxis <xs:group ref=”nombre_grupo”/>
    • attributeGroup name – De la misma forma, podemos definir y asignar un nombre a un grupo de atributos de la forma <xs:attributeGroup name=”nombre_grupo”>…</xs:attributeGroup>
      Una vez definido, podemos hacer referencia a dicho grupo con la sintaxis <xs:attributegroup ref=”nombre_grupo”/>

Referencias:

XML Schema Tutorial

 Publicado por en 7:30 pm

  Una respuesta a “Introducción al lenguaje XSD (XML Schema Definition)”

 Deja un comentario

(requerido)

(requerido)