Un ejemplo de XSD
- Página anterior Reemplazo de elementos de XSD
- Página siguiente Cadena de XSD
Esta sección le mostrará cómo escribir un XML Schema. También aprenderá diferentes métodos para escribir esquemas.
Documento XML
Vamos a ver este documento XML llamado "shiporder.xml":
<?xml version="1.0" encoding="ISO-8859-1"?> <shiporder orderid="889923"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="shiporder.xsd"> <orderperson>George Bush</orderperson> <shipto> <name>John Adams</name> <address>Oxford Street</address> <city>London</city> <country>UK</country> </shipto> <item> <title>Empire Burlesque</title> <note>Special Edition</note> <quantity>1</quantity> <price>10.90</price> </item> <item> <title>Hide your heart</title> <quantity>1</quantity> <price>9.90</price> </item> </shiporder>
Este documento XML incluye el elemento raíz "shiporder", que contiene una propiedad obligatoria llamada "orderid". El elemento "shiporder" contiene tres elementos secundarios diferentes: "orderperson", "shipto" y "item". El elemento "item" aparece dos veces, y contiene un elemento "title", un elemento opcional "note", un "quantity" y un elemento "price".
Esta línea xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance", informa al analizador XML de que debe validar este documento según un esquema específico. Esta línea: xsi:noNamespaceSchemaLocation="shiporder.xsd" especifica la ubicación del esquema (aquí, está en la misma carpeta que "shiporder.xml").
Crear un XML Schema
Ahora, necesitamos crear un esquema para el documento XML anterior.
Podemos comenzar abriendo un nuevo archivo y nombrarlo "shiporder.xsd" . Para crear el esquema, simplemente debemos seguir la estructura del documento XML, definiendo cada elemento que encontremos. Primero, comenzamos con una declaración XML estándar:
<?xml version="1.0" encoding="ISO-8859-1" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> ... ... </xs:schema>
En el esquema anterior, usamos el espacio de nombres estándar (xs), que se asocia con el URI del lenguaje de definición del esquema (Schema language definition), cuyo valor estándar es http://www.w3.org/2001/XMLSchema.
A continuación, necesitamos definir el elemento "shiporder" . Este elemento tiene una propiedad que contiene otros elementos, por lo que lo identificamos como un tipo compuesto. Los elementos hijos del elemento "shiporder" están envueltos por el elemento xs:sequence , que define el orden de los elementos:
<xs:element name="shiporder"> <xs:complexType> <xs:sequence> ... ... </xs:sequence> ... </xs:complexType> </xs:element>
Luego necesitamos definir el elemento "orderperson" como un tipo simple (esto es porque no contiene ninguna propiedad ni otros elementos). El prefijo del tipo (xs:string) es definido por el prefijo del espacio de nombres, que se asocia con el XML schema que indica los tipos de datos de esquema predefinidos:
<xs:element name="orderperson" type="xs:string"/>
A continuación, necesito definir dos elementos como tipos compuestos: "shipto" y "item" . Comencemos definiendo el elemento "shipto":
<xs:element name="shipto"> <xs:complexType> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="address" type="xs:string"/> <xs:element name="city" type="xs:string"/> <xs:element name="country" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element>
A través del esquema, podemos usar las propiedades maxOccurs y minOccurs para definir el número posible de apariciones de un elemento. maxOccurs define el número máximo de apariciones de un elemento, mientras que minOccurs define el número mínimo de apariciones. Los valores predeterminados de maxOccurs y minOccurs son ambos 1!
Ahora, podemos definir el elemento "item" . Este elemento puede aparecer varias veces dentro del elemento "shiporder" . Esto se logra estableciendo el valor de la propiedad maxOccurs del elemento "item" en "unbounded" , permitiendo que el elemento "item" aparezca tantas veces como desee el creador. Tenga en cuenta que el elemento "note" es opcional. Ya hemos establecido la propiedad minOccurs de este elemento en 0:
<xs:element name="item" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="title" type="xs:string"/> <xs:element name="note" type="xs:string" minOccurs="0"/> <xs:element name="quantity" type="xs:positiveInteger"/> <xs:element name="price" type="xs:decimal"/> </xs:sequence> </xs:complexType> </xs:element>
Ahora, podemos declarar las propiedades del elemento "shiporder".. Dado que es un atributo obligatorio, establecemos use="required".
Notas:La declaración de esta propiedad debe colocarse al final:
<xs:attribute name="orderid" type="xs:string" use="required"/>
Esta es la lista de documentos de este archivo de esquema llamado "shiporder.xsd":
<?xml version="1.0" encoding="ISO-8859-1" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="shiporder"> <xs:complexType> <xs:sequence> <xs:element name="orderperson" type="xs:string"/> <xs:element name="shipto"> <xs:complexType> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="address" type="xs:string"/> <xs:element name="city" type="xs:string"/> <xs:element name="country" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="item" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="title" type="xs:string"/> <xs:element name="note" type="xs:string" minOccurs="0"/> <xs:element name="quantity" type="xs:positiveInteger"/> <xs:element name="price" type="xs:decimal"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="orderid" type="xs:string" use="required"/> </xs:complexType> </xs:element> </xs:schema>
Dividir Schema
El método de diseño anterior es muy fácil, pero resulta difícil de leer y mantener cuando los documentos son complejos.
El método de diseño que se presentará a continuación se basa primero en la definición de todos los elementos y atributos, y luego se utilizan las propiedades ref para referirse a ellos.
Este archivo de esquema se diseñó con un nuevo método:
<?xml version="1.0" encoding="ISO-8859-1" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- Definición de elementos simples --> <xs:element name="orderperson" type="xs:string"/> <xs:element name="name" type="xs:string"/> <xs:element name="address" type="xs:string"/> <xs:element name="city" type="xs:string"/> <xs:element name="country" type="xs:string"/> <xs:element name="title" type="xs:string"/> <xs:element name="note" type="xs:string"/> <xs:element name="quantity" type="xs:positiveInteger"/> <xs:element name="price" type="xs:decimal"/> <!-- Definición de atributo --> <xs:attribute name="orderid" type="xs:string"/> <!-- Definición de elemento compuesto --> <xs:element name="shipto"> <xs:complexType> <xs:sequence> <xs:element ref="name"/> <xs:element ref="address"/> <xs:element ref="city"/> <xs:element ref="country"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="item"> <xs:complexType> <xs:sequence> <xs:element ref="title"/> <xs:element ref="note" minOccurs="0"/> <xs:element ref="quantity"/> <xs:element ref="price"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="shiporder"> <xs:complexType> <xs:sequence> <xs:element ref="orderperson"/> <xs:element ref="shipto"/> <xs:element ref="item" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute ref="orderid" use="required"/> </xs:complexType> </xs:element> </xs:schema>
Usando tipos especificados (Tipos Nombrados)
El tercer método de diseño define clases o tipos, lo que nos permite poder reutilizar las definiciones de elementos. La manera específica es: primero nombrar los elementos simples y compuestos, y luego hacer referencia a ellos a través del atributo type de los elementos.
Este es el archivo de esquema diseñado utilizando el tercer método ("shiporder.xsd"):
<?xml version="1.0" encoding="ISO-8859-1" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:simpleType name="stringtype"> <xs:restriction base="xs:string"/> </xs:simpleType> <xs:simpleType name="inttype"> <xs:restriction base="xs:positiveInteger"/> </xs:simpleType> <xs:simpleType name="dectype"> <xs:restriction base="xs:decimal"/> </xs:simpleType> <xs:simpleType name="orderidtype"> <xs:restriction base="xs:string"> <xs:pattern value="[0-9]{6}"/> </xs:restriction> </xs:simpleType> <xs:complexType name="shiptotype"> <xs:sequence> <xs:element name="name" type="stringtype"/> <xs:element name="address" type="stringtype"/> <xs:element name="city" type="stringtype"/> <xs:element name="country" type="stringtype"/> </xs:sequence> </xs:complexType> <xs:complexType name="itemtype"> <xs:sequence> <xs:element name="title" type="stringtype"/> <xs:element name="note" type="stringtype" minOccurs="0"/> <xs:element name="quantity" type="inttype"/> <xs:element name="price" type="dectype"/> </xs:sequence> </xs:complexType> <xs:complexType name="shipordertype"> <xs:sequence> <xs:element name="orderperson" type="stringtype"/> <xs:element name="shipto" type="shiptotype"/> <xs:element name="item" maxOccurs="unbounded" type="itemtype"/> </xs:sequence> <xs:attribute name="orderid" type="orderidtype" use="required"/> </xs:complexType> <xs:element name="shiporder" type="shipordertype"/> </xs:schema>
El elemento 'restriction' muestra que el tipo de datos de los datos proviene del espacio de nombres del esquema XML de W3C. Por lo tanto, el siguiente fragmento significa que el valor del elemento o atributo debe ser de tipo cadena:
<xs:restriction base="xs:string">
El elemento de restricción se utiliza a menudo para aplicar restricciones a los elementos. Vea los siguientes fragmentos del esquema anteriores:
<xs:simpleType name="orderidtype"> <xs:restriction base="xs:string"> <xs:pattern value="[0-9]{6}"/> </xs:restriction> </xs:simpleType>
Este código indica que el valor del elemento o atributo debe ser una cadena y debe ser continua de seis caracteres, y estos caracteres deben ser números del 0 al 9.
- Página anterior Reemplazo de elementos de XSD
- Página siguiente Cadena de XSD