Un ejemplo de XSD
- Página anterior Reemplazo de elemento 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 un atributo obligatorio llamado "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 "note" opcional, 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 está asociado 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 se debe a que no contiene ninguna propiedad o otros elementos). El prefijo del tipo (xs:string) es definido por el prefijo del espacio de nombres, que está asociado con el esquema XML 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 la cantidad de veces que puede aparecer un elemento. maxOccurs define el valor máximo de aparición de un elemento, mientras que minOccurs define el valor mínimo de aparición de un elemento. Los valores predeterminados de maxOccurs y minOccurs son 1!
Ahora, podemos definir el elemento "item" . Este elemento puede aparecer múltiples veces dentro del elemento "shiporder" . Esto se logra estableciendo el valor de la propiedad maxOccurs del elemento "item" en "unbounded" , de modo que el elemento "item" puede aparecer 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" Since es un atributo obligatorio, definimos 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 en el uso del atributo ref para referenciarlos.
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 elemento simple --> <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>
Uso de tipos especificados (Tipos Nombrados)
El tercer método de diseño define clases o tipos, lo que nos permite reutilizar las definiciones de elementos. La forma específica es: primero nombrar los elementos simples y complejos, y luego usar la propiedad type de los elementos para apuntar a ellos.
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 de restricción muestra que el tipo de 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 comúnmente para aplicar limitaciones a los elementos. Vea a continuación algunos fragmentos de la 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 0-9.
- Página anterior Reemplazo de elemento de XSD
- Página siguiente Cadena de XSD