Schema para validar XML

El siguiente Schema es utilizado para validar la estructura de una agenda escrita en XML, dentro de las definiciones se usan la gran mayoría de las estructuras disponibles para Schemas.

A diferencia de DTD's se puede notar que la estructura de Schemas es mucho más expresiva, además es posible restringir el tipo/contenido de datos algo que no es posible en DTD's, y desde luego el uso de XML que no obliga al programador a conocer el lenguaje EBNF("Extended Backus Naur Form")

Schema par validar XML agenda.xsd


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

<!-- La declaración anterior define el documento como XML y 
        además define el Namespace de XML-Schema bajo el vocablo xsd 
    -->
 
<!-- En esta sección se indica que dentro del elemento agenda 
        se deben encontrar al menos (minOcurrs) un elemento del 
	tipo persona sin ningún limite superior (maxOcurrs)
	Posteriormente se define una restricción, la cual indica 
	que dentro de los elementos persona los valores de 
	nombre y apellido deben ser únicos, esto
	permite que no sean duplicadas personas en la agenda.
     -->

 <xsd:element name="agenda">

  <xsd:complexType>
   <xsd:sequence>
     <xsd:element ref="persona" minOccurs="1" maxOccurs="unbounded"/>
   </xsd:sequence>
  </xsd:complexType>

  <xsd:unique name="unica">
   <xsd:selector xpath="persona"/>
   <xsd:field xpath="nombrecompleto/nombre"/>
   <xsd:field xpath="nombrecompleto/apellido"/>
  </xsd:unique>

 </xsd:element>

  <!-- Dentro del elemento persona deben encontrarse anidados
          el elemento nombrecompleto; correo el cual 
	  no tiene limite superior,  ubicación  y telefono
	  que esta restringido a 2 máximo.
          Los elementos clasificación y edad también 
          deben encontrarse anidados dentro de dicho elemento.
          (NOTA: Aquellos elementos que no especifiquen 
          los atributos minOccurs y maxOccurs, toman los valores default,
           1 y 1 respectivamente ) 
	  Además se indica que el atributo id es obligatorio 
	  para este elemento y debe ser del tipo string 
          También es definido el atributo visible el cual es opcional 
          y debe ser del tipo boolean (true o false).
    -->


 <xsd:element name="persona">
  <xsd:complexType>
   <xsd:sequence>
     <xsd:element ref="nombrecompleto"/>
     <xsd:element ref="correo" minOccurs="0" maxOccurs="unbounded"/>
     <xsd:element ref="ubicacion"/>
     <xsd:element ref="telefono"  minOccurs="0" maxOccurs="2"/>
     <xsd:element ref="clasificacion"/>
     <xsd:element ref="edad"/>
   </xsd:sequence>
   <xsd:attribute name="id"  type="xsd:integer" use="required"/>
   <xsd:attribute name="visible"  type="xsd:boolean" use="optional"/>
  </xsd:complexType>
 </xsd:element>

  
  <!-- En esta sección se define la composición del elemento 
        nombrecompleto el cual debe contener en su estructura
	los elementos nombre y apellido

      -->

  

 <xsd:element name="nombrecompleto">
  <xsd:complexType>
   <xsd:all>
    <xsd:element ref="apellido"/>
    <xsd:element ref="nombre"/>
   </xsd:all>
  </xsd:complexType>
 </xsd:element>
                                       

  <!-- Las siguientes tres declaraciones definen
 el formato del contenido de apellido,nombre  
 y correo que es del tipo string, en otras palabras texto. 
      -->


 <xsd:element name="apellido" type="xsd:string"/>

 <xsd:element name="nombre" type="xsd:string"/>

 <xsd:element name="correo" type="xsd:string"/>


<!-- El elemento ubicacion debe incluir los elementos 
   ciudad y pais   
   -->


 <xsd:element name="ubicacion">
  <xsd:complexType>
   <xsd:all>
    <xsd:element ref="ciudad"/>
    <xsd:element ref="pais"/>
   </xsd:all>
  </xsd:complexType>
 </xsd:element>


 <!-- Aquí se define el formato de ciudad, pais, 
 telefono, clasificacion y edad; las dos primeras utilizan el formato 
 string, sin embargo, el resto de los elementos utilizan un diseño 
 especial que se describe a continuación 
       -->


 <xsd:element name="ciudad" type="xsd:string"/>

 <xsd:element name="pais" type="xsd:string"/>

 <xsd:element name="telefono" type="formatotelefono"/>

 <xsd:element name="clasificacion" type="formatoclasificacion"/>

 <xsd:element name="edad" type="formatoedad"/>


Regular Expressions   
   <!-- El siguiente formato indica que además de ser del tipo string
   éste se encuentra restringido a 12 espacios, los cuales deben poseer 
   la secuencia: 2 digitos (guión) 4 digitos (guión) 4 digitos.
     (NOTA: La sintaxis utilizada en los elementos xsl:pattern
            representan secuencias de Regular Expressions )
   -->


 <xsd:simpleType name="formatotelefono">
   <xsd:restriction base="xsd:string">
     <xsd:length value="12"/>
     <xsd:pattern value="\d{2}-\d{4}-\d{4}"/>
   </xsd:restriction>
 </xsd:simpleType>

   <!-- El siguiente formato indica que además de ser 
     del tipo string éste se encuentra restringido a 3 alternativas 
   descritas en los elementos  xsd:enumaration, en este caso 
   a los valores Trabajo, Familia y Personal.
   -->


 <xsd:simpleType name="formatoclasificacion">
   <xsd:restriction base="xsd:string">
     <xsd:enumeration value="Trabajo"/>
     <xsd:enumeration value="Familia"/>
     <xsd:enumeration value="Personal"/>
   </xsd:restriction>
 </xsd:simpleType>

integer   <!-- El siguiente formato indica que además de ser 
   del tipo integer éste se encuentra restringido a un valor
   mayor a 18 y menor que 65.
   -->


 <xsd:simpleType name="formatoedad">
   <xsd:restriction base="xsd:integer">
     <xsd:minInclusive value="18"/>
     <xsd:maxInclusive value="65"/>
   </xsd:restriction>
 </xsd:simpleType>


   <!-- Se cierra el elemento raíz del documento XML --> 

</xsd:schema>

El siguiente fragmento cumple con los requerimientos del Schema anterior.

Documento XML datos.xml


<?xml version="1.0" encoding="UTF-8"?>

<agenda>

  <persona id="1" visible="false">

    <nombrecompleto>

        <apellido>Rubio</apellido> 
        <nombre>Daniel</nombre>
  
   </nombrecompleto>
 
    <correo>daniel@osmosislatina.com</correo>
    <correo>d_rubio@yahoo.com</correo>
 
    <ubicacion>

        <ciudad>Ensenada</ciudad>
        <pais>Mexico</pais>

    </ubicacion>
 
    <telefono>52-6532-4320</telefono>
    <clasificacion>Personal</clasificacion>
    <edad>27</edad>
  </persona>

  <persona id="2">

    <nombrecompleto>

       <apellido>Fontes</apellido> 
       <nombre>Fernanda</nombre>

    </nombrecompleto>

    <correo>fontes@slb.com</correo>

    <ubicacion>

        <ciudad>Macae</ciudad>
        <pais>Brazil</pais>

    </ubicacion>

    <telefono>55-8854-6500</telefono>
    <clasificacion>Trabajo</clasificacion>
    <edad>35</edad>
  </persona>


</agenda>

Menú Curso

XML y sus Orígenes

Manipulación y Proceso de XML

DOM, SAX y JDOM

Namespaces, Schemas y DTD's

XSL: XSLT, XPath y TraX

XMLRPC y SOAP (Web Services)

Diseño con XMLRPC

Diseño con SOAP .

Apéndice "A" (Procesando XML con parsers).

Apéndice "B" (Validando XML con Schemas y DTD's).

Apéndice "C" (XSL: XPath y "XSL Stylesheets").

Apéndice "D" (XMLRPC: Diseño).

Apéndice "E" (SOAP, WSDL, UDDI y WSIL : Diseño).