| Creación de un XML Schema que valida documentos XML |
| Paso 2: Operativa |
En esta operativa vamos a ir creando en paralelo los documentos pedido.xml y pedido .xsd para irnos familiarizando con la sintaxis de los documentos XML Schema.
Nota: La síntesis de las palabras clave y la sintaxis de los XML Schema la podemos encontrar en Apéndice - Palabras clave y sintaxis de los XML Schema
Primeras modificaciones y comprobaciones de que los documentos XML Schema y XML estan bien formados y bien validados
Vamos a modificar el código del fichero pedido.xml de la siguiente forma
<?xml version="1.0" encoding="UTF-8"?>
<pedido xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:noNamespaceSchemaLocation='pedido.xsd'>
<enviarA>localidad de envío</enviarA>
<facturarA>localidad de facturación</facturarA>
<comentario>Líneas de pedido</comentario>
<articulos>Lista de artículos</articulos>
</pedido> |
- <pedido xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:noNamespaceSchemaLocation='pedido.xsd'>
- en el elemento raíz pedido enlazamos el documento pedido.xml con el XML Schema pedido.xsd
- de momento el elemento raíz pedido tiene los subelementos enviarA, facturarA, comentario, articulos los cuales también de momentos sólo tienen contenido
Y ahora vamos a modificar el código del fichero pedido.xsd de la siguiente forma
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xsd:element name="pedido" type="PedidoType"/>
<xsd:complexType name="PedidoType">
<xsd:sequence>
<xsd:element name="enviarA" type="xsd:string"/>
<xsd:element name="facturarA" type="xsd:string"/>
<xsd:element name="comentario" type="xsd:string"/>
<xsd:element name="articulos" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema> |
- <xsd:element name="pedido" type="PedidoType"/>
- estamos declarando que hay un elemento llamado pedido y que éste es un tipo complejo
- <xsd:complexType name="PedidoType">
- esta es la definicón del elemento PedidoType
- <xsd:sequence>
- dado que dentro del elemento PedidoType hay una secuencia de elementos usamos <xsd:sequence> para indicar la secuencia de los elementos que va a contener
- el orden que indcamos en el XML Schema, es el mismo orden en el cual tendrán que aparecer los subelementos en el documento XML, en nuestro caso pedido.xml
- <xsd:element name="enviarA" type="xsd:string"/>
- estamos declarando que hay un elemento llamado pedido y que éste es un tipo simple
- el elemento enviarA contiene texto de tipo string
Crear un elemento global y una referencia al elemento global
Vamos a hacer que el elemento globla sea el elemento comentario de la siguiente forma
| <xsd:element name="comentario" type="xsd:string"/> |
Cuando un elemento se repite varias veces en un XML Schema nos puede salir más a cuenta crear un elemento global
- un elemento global
- tiene que estar declarado como un subelemto del elemento <xsd:schema>, pero nunca como parte de un elemento complejo
- no puede contener referencias
- es decir no pueden albergar el atributo ref
- no pude indicar el
número de ocurrencias que tiene que aparecer un elemento
Esta es la sintaxis de una declaración local a una referencia de un elemento global
| <xsd:element ref="nombreElementoGlobalYaExistente" minOccurs="valor"> |
- el atributo ref tiene que referenciar a un elemento global
- en la declaración local si queremos podemos indicar la cardinalidad del elemento global con los atributos minOccurs y maxOccurs
Para realizar la referencia al elemento global comentario varmos a tener que modificar la siguiente línea de código
| <xsd:element name="comentario" type="xsd:string"/> |
También vamos a indicar que la referencia al elemento global comentario puede aparecer una o ninguna vez.
Ahora vamos a añadir el elemento global comentario y a crear una referencia hacia este elemento en el documento pedido.xsd
Compara tu código con la solución propuesta
Añadir un atributo opcional a un tipo complejo
Ampliamos el documento pedido.xml añadiento al elemento pedido el atriibuto fechaPedido
- el atributo fechaPedido
- es de tipo xsd:date
- puede aparecer o no aparecer en el documento pedido.xml
Este es el código del documento pedido.xml con el nuevo atributo
<?xml version="1.0" encoding="UTF-8"?>
<pedido fechaPedido="2006-06-22"
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:noNamespaceSchemaLocation='pedido.xsd'>
<enviarA>localidad de envío</enviarA>
<facturarA>localidad de facturación</facturarA>
<comentario>Líneas de pedido</comentario>
<articulos>Lista de artículos</articulos>
</pedido> |
Esta es la declaración de un atributo
<xsd:attribute
name="nombreAtributo"
type="tipoSimple"
use="valor"
default="valor"
fixed="valor"/> |
- name
- es el nombre del atributo que está incluido en un elemento
- type
- los atributos sólo pueden contener tipos simples
- use (Opcional)
- conjunto de valores de use
- required
- el atributo debe aparecer en el documento XML
- optional
- el atributo puede que aparezca o no aparezca en el documento XML
- este es el valor por defecto
- por tanto no es necesario emplearlo
- prohibited
- el atributo no debe aparecer en el documento XML
- default (Opcional)
- si el atributo no
aparece en el documento instanciado, el parser del esquema se encarga
de ofrecer el valor contenido en el atributo default
- los valores por defecto
sólo tienen sentido si el atributo es opcional
- por lo tanto tendremos
un error si en el atributo use hemos indicado cualquier
valor que no sea optional
- fixed (Opcional)
- si el valor del atributo
está presente en la instancia del docuemento debe ser el mismo
que el que indica el atributo fixed
- si el atributo no
está presente, el parser del esquema ofrecerá el valor
contenido en el atributo fixed
- los valores de los
atributos default y fixed son mutuamente
exclusivos
- por lo tanto habrá un error si una declaración
contiene ambos
Ahora vamos a ampliar el documento pedido.xsd
Compara tu código con la solución propuesta
Añadir un nuevo tipo complejo
En el documento pedido.xml modificamos el contenido de texto de los elementos enviarA y facturarA. Estos elementos van a albergar los subelementos nombre, calle, ciudad, estado y codigoPostal
<?xml version="1.0" encoding="UTF-8"?>
<pedido xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:noNamespaceSchemaLocation='pedido.xsd'>
<enviarA>
<nombre>Alice Smith</nombre>
<calle>123 Maple Street</calle>
<ciudad>Cambridge</ciudad>
<estado>MA</estado>
<codigoPostal>12345</codigoPostal>
</enviarA>
<facturarA>
<nombre>John Bob</nombre>
<calle>242 Main Street</calle>
<ciudad>Beverly Hills</ciudad>
<estado>CA</estado>
<codigoPostal>90210</codigoPostal>
</facturarA>
<comentario>Líneas de pedido</comentario>
<articulos>Lista de artículos</articulos>
</pedido> |
Ahora tenemos que realizar modificaciones al documento pedido.xsd teniendo en cuenta lo siguiente
- los elemento enviarA y facturarA pasan de ser tipos simples a tipos complejos de tipo DireccionEEUU
- el tipo complejo DireccionEEUU contiene la secuencia de elementos nombre, calle, ciudad, estado y codigoPostal
- los elementos nombre, calle, ciudad, estado
Ahora vamos a ampliar el documento pedido.xsd
Compara tu código con la solución propuesta
Añadir un atributo fijo a un tipo complejo
Ampliamos el documento pedido.xml añadiento a los elementos enviarA y facturarA el atriibuto pais
- el atributo pais
- es de tipo xsd:NMTOKEN
- NMTOKEN
- es una cadena de caracteres compuesta por letras, números, puntos, dos puntos, guiones y subrayados
- pero no puede tener espacios
- NMTOKENS
- es una cadena de caracteres compuesta por letras, números, puntos, dos puntos, guiones y subrayados
- también puede tener espacios
- NMTOKEN y NMTOKENS
- son tipos de datos propios de los Documentos DTD
- XML Schema los admite para así de esta forma ser compatible con los tipos de datos DTD
- sólo contiene EEUU como valor
- para indicar que siempre el país será EEUU, lo podemos realizar de las siguientes dos formas
- en el caso del elemento enviarA el atributo pais y su valor lo escribimos de forma explícita
- en el caso del elemento facturarA el atributo pais no lo escribimos
- en este caso el parser cuando lea el documento pedido.xml y quiera saber a que páis tiene que facturar el pedido leerá el documento pedido.xsd y verá que el páis EEUU está de forma fija
<?xml version="1.0" encoding="UTF-8"?>
<pedido xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:noNamespaceSchemaLocation='pedido.xsd'>
<enviarA pais="EEUU">
<nombre>Alice Smith</nombre>
<calle>123 Maple Street</calle>
<ciudad>Cambridge</ciudad>
<estado>MA</estado>
<codigoPostal>12345</codigoPostal>
</enviarA>
<facturarA>
<nombre>John Bob</nombre>
<calle>242 Main Street</calle>
<ciudad>Beverly Hills</ciudad>
<estado>CA</estado>
<codigoPostal>90210</codigoPostal>
</facturarA>
<comentario>Líneas de pedido</comentario>
<articulos>Lista de artículos</articulos>
</pedido> |
Ahora vamos a ampliar el documento pedido.xsd
Compara tu código con la solución propuesta
Creación de un tipo anónimo complejo
Ampliamos el documento pedido.xml añadiendo dos subelementos articulo al elemento articulos
<?xml version="1.0" encoding="UTF-8"?>
<pedido xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:noNamespaceSchemaLocation='pedido.xsd'>
<enviarA pais="EEUU">
<nombre>Alice Smith</nombre>
<calle>123 Maple Street</calle>
<ciudad>Cambridge</ciudad>
<estado>MA</estado>
<codigoPostal>12345</codigoPostal>
</enviarA>
<facturarA>
<nombre>John Bob</nombre>
<calle>242 Main Street</calle>
<ciudad>Beverly Hills</ciudad>
<estado>CA</estado>
<codigoPostal>90210</codigoPostal>
</facturarA>
<comentario>Líneas de pedido</comentario>
<articulos>
<articulo>
<nombreProducto>Cortacésped</nombreProducto>
<precioEEUU>148.95</precioEEUU>
<comentario>Eléctrico con baterías recargables</comentario>
<fechaEnvio>2006-06-28</fechaEnvio>
</articulo>
<articulo>
<nombreProducto>Bolsa de tierra de abono marca Acme</nombreProducto>
<precioEEUU>7.20</precioEEUU>
</articulo>
</articulos>
</pedido> |
Ahora vamos a modificar el documento pedido.xsd teniendo en cuenta lo siguiente
- el elemento articulos pasa de ser un tipo simple a un tipo complejo llamado Articulos
- el subelemento articulo es un tipo anónimo complejo que es hijo del elemento <xsd:complexType name ="Articulos">
- atriculo tiene la siguiente secuencia de subelementos
- nombreProducto
- es de tipo <xsd:string>
- sólo aparece una vez
- precioEEUU
- es de tipo <xsd:decimal>
- sólo aparece una vez
- comentario
- es de tipo <xsd:string>
- aparece una o ninguna vez
- fechaEnvio
- es de tipo <xsd:date>
- aparece una o ninguna vez
Compara tu código con la solución propuesta
Creación de un tipo anónimo simple con restricción para limitar valores numéricos
Ampliamos el documento pedido.xml añadiendo un subelemento cantidad a los elementos articulo
<?xml version="1.0" encoding="UTF-8"?>
<pedido xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:noNamespaceSchemaLocation='pedido.xsd'>
<enviarA pais="EEUU">
<nombre>Alice Smith</nombre>
<calle>123 Maple Street</calle>
<ciudad>Cambridge</ciudad>
<estado>MA</estado>
<codigoPostal>12345</codigoPostal>
</enviarA>
<facturarA>
<nombre>John Bob</nombre>
<calle>242 Main Street</calle>
<ciudad>Beverly Hills</ciudad>
<estado>CA</estado>
<codigoPostal>90210</codigoPostal>
</facturarA>
<comentario>Líneas de pedido</comentario>
<articulos>
<articulo>
<nombreProducto>Cortacésped</nombreProducto>
<cantidad>1</cantidad>
<precioEEUU>148.95</precioEEUU>
<comentario>Eléctrico con baterías recargables</comentario>
<fechaEnvio>2006-06-28</fechaEnvio>
</articulo>
<articulo>
<nombreProducto>Bolsa de tierra de abono marca Acme</nombreProducto>
<cantidad>1</cantidad>
<precioEEUU>7.20</precioEEUU>
</articulo>
</articulos>
</pedido> |
Ahora vamos a modificar el documento pedido.xsd teniendo en cuenta lo siguiente
- el subelemento cantidad
- es un tipo anónimo simple que se encuentra ubuicado justo debajo del subelemento <xsd:element name="nombreProducto" type="xsd:string"/>
- es de tipo <xsd:positiveInteger>
- sólo aparece una vez
- y tiene una restricción
- la cantidad tiene que ser menor , pero no igual a 100
Compara tu código con la solución propuesta
Creación de un tipo simple con una restricción basada en una expresión regular
Ampliamos el documento pedido.xml añadiendo el atributo codigoStock al elemento articulo
<?xml version="1.0" encoding="UTF-8"?>
<pedido xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:noNamespaceSchemaLocation='pedido.xsd'>
<enviarA pais="EEUU">
<nombre>Alice Smith</nombre>
<calle>123 Maple Street</calle>
<ciudad>Cambridge</ciudad>
<estado>MA</estado>
<codigoPostal>12345</codigoPostal>
</enviarA>
<facturarA>
<nombre>John Bob</nombre>
<calle>242 Main Street</calle>
<ciudad>Beverly Hills</ciudad>
<estado>CA</estado>
<codigoPostal>90210</codigoPostal>
</facturarA>
<comentario>Líneas de pedido</comentario>
<articulos>
<articulo codigoStock="872-AA">
<nombreProducto>Cortacésped</nombreProducto>
<cantidad>1</cantidad>
<precioEEUU>148.95</precioEEUU>
<comentario>Eléctrico con baterías recargables</comentario>
<fechaEnvio>2006-06-28</fechaEnvio>
</articulo>
<articulo codigoStock="926-BC">
<nombreProducto>Bolsa de tierra de abono marca Acme</nombreProducto>
<cantidad>1</cantidad>
<precioEEUU>7.20</precioEEUU>
</articulo>
</articulos>
</pedido> |
Vamos a realizar la última modificación del documento pedido.xsd teniendo en cuenta lo siguiente
- el atributo codigoStock
- es de tipo simple SKU
- SKU (Stock Keeping Unit, Unidad de mantenimiento de existencias) es un código asociado a un producto para fines de inventariado.
- es obligado que cada uno de los articulos lo tenga
- tiene la siguiente restricción
- tiene que ser un string que empiece con tres dígitos seguido de un guión y después del guión dos caracteres con un rango de la A a la Z
Nota: En este vínculo encontraremos una tabla con la sintaxis de las expresiones regulares Apéndice - Sintaxis de las expresiones regulares
Compara tu código con la solución propuesta