XSD o XML Schema
XSD o XML Schema
XSD o XML Schema
<marcadores xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:noNamespaceSchemaLocation="marcadores.xsd">
• Para vincular un esquema a un documento XML, es obligatorio que este último haga
referencia al espacio de nombres http://www.w3.org/2001/XMLSchema-instance.
Para ello, habitualmente se utiliza el prefijo xsi.
<marcadores xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:schemaLocation=“http://www.ggg.com/marcadores.xsd">
Validación documento XML con XSD (XML Schema)
Para estar bien formado, un esquema XML tiene que cumplir las mismas reglas de sintaxis
que cualquier otro documento XML.
Por otra parte, hay que tener en cuenta que, en todos los esquemas XML, el elemento raíz es
"schema". Ahora bien, para escribirlo, es muy común utilizar el prefijo xsd o xs.
• sequence indica que los elementos hijo deben aparecer, en el documento XML, en el
mismo orden en el que sean declarados en el esquema.
• Los elementos "nombre", "descripción" y "url" son de tipo simple (string en este caso)
y no pueden contener a otros elementos.
Los tipos de datos predefinidos pueden ser primitivos (string, date, time, dateTime,
hexBinary, boolean, decimal...) o derivados de estos (integer, ID, IDREF...)
<nombre>Elsa</nombre>
<edad>23</edad>
Si se quiere indicar que un valor es fijo (fixed), se puede escribir, por ejemplo:
<curso grupo="B">2</curso>
Para indicar que el valor de un atributo es fijo (fixed), es posible escribir, por
ejemplo:
<xs:element name="mes">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="1"/>
<xs:maxInclusive value="12"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
xs:totalDigits y xs:fractionDigits
<xs:element name=“litros”>
<xs:simpleType>
<xs:restriction base="xs:decimal">
<xs:totalDigits value=“5”/>
<xs:fractionsDigits value=“2”/>
</xs:restriction>
</xs:simpleType>
</xs:element>
xs:enumeration
<xs:element name="color">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="verde"/>
<xs:enumeration value="amarillo"/>
<xs:enumeration value="rojo"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
xs:pattern
<xs:element name="letra">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
xs:length
<xs:element name="clave">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="12"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
En el siguiente ejemplo se define un elemento llamado "dirección" con la restricción de que los
espacios en blanco, las tabulaciones, los saltos de línea y los retornos de carro que aparezcan en él,
se deben mantener (preserve):
<xs:element name="direccion">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
xs:whiteSpace sirve para especificar cómo se debe tratar a los posibles espacios en blanco, las
tabulaciones, los saltos de línea y los retornos de carro que puedan aparecer.
• replace para sustituir todas las tabulaciones, los saltos de línea y los retornos de carro por
espacios en blanco.
• collapse para, después de reemplazar todas las tabulaciones, los saltos de línea y los retornos
de carro por espacios en blanco, eliminar todos los espacios en blanco únicos y sustituir varios
espacios en blanco seguidos por un único espacio en blanco.
Definir elementos simples
Elemento simple:
Elemento vacío
En el siguiente código se ha definido vacío el elemento "bola", no pudiendo contener ni otros elementos ni texto. Ahora bien,
véase que sí tiene un atributo, llamado numero:
<xs:element name="bola">
<xs:complexType>
<xs:attribute name="numero" type="numeroDeBola"/>
</xs:complexType>
</xs:element>
Contenido mixto
Se ha definido el elemento "persona" de tipo complejo mixto (mixed="true") Puede contener uno o más elementos, además
de texto. Por otra parte, podría tener atributos, o no.
Mientras que xs:sequence sirve para especificar el orden en el que obligatoriamente deben aparecer
los elementos hijo de un elemento, xs:all sirve para indicar que dichos elementos pueden aparecer en
cualquier orden pero solo una vez.
Por otra parte, xs:choice sirve para especificar que solamente se permite escribir uno de los
elementos hijo. Por ejemplo, en este caso, se podría utilizar para indicar que habría que elegir entre
escribir el "nombre" o escribir el "país" de la "ciudad", pero no ambos.
Secuencia de elementos en XSD (XML Schema)
Indicadores de ocurrencia (maxOccurs, minOccurs)
El código del archivo "paises.xsd" que permita validar "paises.xml", podría ser:
Indicadores en XSD (XML Schema)
Indicadores de ocurrencia (maxOccurs, minOccurs)
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<paises <xs:schema
xmlns:xsi="http://www.w3.org/2001/XM xmlns:xs="http://www.w3.org/2001/XMLSchema">
LSchema-instance" <xs:element name="paises">
xsi:noNamespaceSchemaLocation="pa <xs:complexType>
ises.xsd"> <xs:sequence>
<pais> <xs:element name="pais"
<nombre>Argentina</nombre> maxOccurs="unbounded">
<ciudad>Buenos Aires</ciudad> <xs:complexType>
<ciudad>Rosario</ciudad> <xs:sequence>
</pais> <xs:element name="nombre" type="xs:string"/>
<pais> <xs:element name="ciudad" type="xs:string"
<nombre>México</nombre> minOccurs="0" maxOccurs="5"/>
<ciudad>Guadalajara</ciudad> </xs:sequence>
<ciudad>Monterrey</ciudad> </xs:complexType>
<ciudad>Cancún</ciudad> </xs:element>
<ciudad>Mérida</ciudad> </xs:sequence>
<ciudad>Ciudad de México</ciudad> </xs:complexType>
</pais> </xs:element>
<pais> </xs:schema>
<nombre>Colombia</nombre>
</pais>
</paises>
EJERCICIOS
<ciudad>Roma</ciudad>
<fecha-de-nacimiento>1996-12-18</fecha-de-nacimiento>
<hora>18:29:45</hora>
<nota>7.5</nota>
<apto>true</apto>
Escribir el contenido del archivo “fichas.xsd” que permita validarlo, teniendo en cuenta que se debe
definir la “edad” con la restricción de que el valor que tome no pueda ser menor que 0 ni mayor que
130. Además, en vez de xs:minInclusive y xs:maxInclusive, se debe utilizar:
• xs:minExclusive que sirve para especificar que el valor debe ser mayor que el indicado.
• xs:maxExclusive que sirve para especificar que el valor debe ser menor que el indicado.
Respuesta
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="fichas">
<xs:complexType>
<xs:sequence>
<xs:element name="ficha" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
<xs:element name="edad">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minExclusive value="-1"/>
<xs:maxExclusive value="131"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
<xs:attribute name="numero" type="xs:integer"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Respuesta
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="fichas">
<xs:complexType>
<xs:sequence>
<xs:element name="ficha" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
<xs:element name="edad" type="edadPersona"/>
</xs:sequence>
<xs:attribute name="numero" type="xs:integer"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="edadPersona">
<xs:restriction base="xs:integer">
<xs:minExclusive value="-1"/>
<xs:maxExclusive value="131"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
EJERCICIOS
Dado el siguiente documento XML:
Escribir el contenido del archivo “precios.xsd” que permita validarlo, teniendo en cuenta
que el elemento “precio” puede tomar por valor un número que contenga tres dígitos
como máximo y, de ellos, solamente dos pueden ser decimales. Para ello, escribir una
restricción que no podrá ser utilizada por otros elementos y, por otra parte, haga uso de:
• xs:totalDigits que sirve para especificar el número máximo de dígitos que puede
tener un número, incluyendo a los decimales.
• xs:fractionDigits que sirve para especificar el número máximo de decimales que
puede tener un número.
Respuesta
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="precios">
<xs:complexType>
<xs:sequence>
<xs:element name="precio" maxOccurs="unbounded">
<xs:simpleType>
<xs:restriction base="xs:decimal">
<xs:totalDigits value="3"/>
<xs:fractionDigits value="2"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>