Validación de un documento XML con XSD (XML Schema)
EJEMPLO Se quiere almacenar una lista de marcadores de páginas web, guardando de cada uno de ellos su nombre, una descripción y su URL. Para ello, se ha escrito el siguiente documento XML ("marcadores.xml") asociado al archivo "marcadores.xsd":
<?xml version="1.0" encoding="UTF-8"?>
<marcadores xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="marcadores.xsd">
<pagina>
<nombre>Abrirllave</nombre>
<descripcion>Tutoriales de informática.</descripcion>
<url>http://www.abrirllave.com/</url>
</pagina>
<pagina>
<nombre>Wikipedia</nombre>
<descripcion>La enciclopedia libre.</descripcion>
<url>http://www.wikipedia.org/</url>
</pagina>
<pagina>
<nombre>W3C</nombre>
<descripcion>World Wide Web Consortium.</descripcion>
<url>http://www.w3.org/</url>
</pagina>
</marcadores>
- 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.
- El atributo noNameSchemaLocation permite referenciar a un archivo con la definición de un esquema que no tiene ningún espacio de nombres asociado. En este caso, dicho archivo es "marcadores.xsd".
El esquema XML guardado en "marcadores.xsd" y que permita validar el documento XML "marcadores.xml" podría ser:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="marcadores">
<xs:complexType>
<xs:sequence>
<xs:element name="pagina" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
<xs:element name="descripcion" type="xs:string"/>
<xs:element name="url" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs: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.
Con xmlns:xs="http://www.w3.org/2001/XMLSchema" se ha indicado que:
- Los elementos y tipos de datos utilizados en el esquema pertenecen al espacio de nombres http://www.w3.org/2001/XMLSchema.
- Dichos elementos y tipos de datos deben llevar el prefijo xs (xs:schema, xs:element, xs:complexType, xs:string...).
Fíjese también que:
- Los elementos "marcadores" y "página" son de tipo complejo (complexType), ya que, contienen a otros elementos.
- 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.
- Mediante maxOccurs="unbounded" se ha indicado que pueden aparecer ilimitados elementos "página" en el documento XML.
Ejercicio |
---|
Definición de un espacio de nombres
EJEMPLO En el siguiente documento XML se ha definido un espacio de nombres escribiendo xmlns:mar="http://www.abrirllave.com/marcadores":
<?xml version="1.0" encoding="UTF-8"?>
<mar:marcadores xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.abrirllave.com/marcadores marcadores.xsd"
xmlns:mar="http://www.abrirllave.com/marcadores">
<mar:pagina>
<mar:nombre>Abrirllave</mar:nombre>
<mar:descripcion>Tutoriales de informática.</mar:descripcion>
<mar:url>http://www.abrirllave.com/</mar:url>
</mar:pagina>
<mar:pagina>
<mar:nombre>Wikipedia</mar:nombre>
<mar:descripcion>La enciclopedia libre.</mar:descripcion>
<mar:url>http://www.wikipedia.org/</mar:url>
</mar:pagina>
<mar:pagina>
<mar:nombre>W3C</mar:nombre>
<mar:descripcion>World Wide Web Consortium.</mar:descripcion>
<mar:url>http://www.w3.org/</mar:url>
</mar:pagina>
</mar:marcadores>
En el atributo schemaLocation se pueden escribir parejas de valores:
- En el primer valor de cada pareja, hay que hacer referencia a un espacio de nombres.
- En el segundo valor, se tiene que indicar la ubicación de un archivo donde hay un esquema de ese espacio de nombres.
En cuanto al archivo "marcadores.xsd", ahora su código podría ser:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.abrirllave.com/marcadores"
xmlns="http://www.abrirllave.com/marcadores"
elementFormDefault="qualified">
<xs:element name="marcadores">
<xs:complexType>
<xs:sequence>
<xs:element name="pagina" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="nombre" type="xs:string"/>
<xs:element name="descripcion" type="xs:string"/>
<xs:element name="url" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
- En el atributo targetNamespace se está indicando que los elementos definidos en este esquema ("marcadores", "página", "nombre", "descripción" y "url"), provienen del espacio de nombres http://www.abrirllave.com/marcadores.
- xmlns="http://www.abrirllave.com/marcadores" especifica que este es el espacio de nombres por defecto.
- El atributo elementFormDefault="qualified" indica que todos los elementos declarados localmente en el esquema tienen que estar calificados, es decir, tienen que pertenecer a un espacio de nombres. Por esta razón, en "marcadores.xml" se han escrito con el prefijo mar.
Elementos globales y locales en XSD
Los elementos pueden ser globales o locales:
- Los elementos globales son hijos directos del elemento raíz, <xs:schema> en este caso. En el ejemplo que estamos tratando, solamente existe un elemento global: <xs:element name="marcadores">.
- Los elementos locales son el resto de elementos.
Cuando se define un espacio de nombres, los elementos globales tienen que estar calificados, obligatoriamente.
elementFormDefault="unqualified"
EJEMPLO En el supuesto de que el valor del atributo elementFormDefault fuese "unqualified", para que "marcadores.xml" fuese válido, se podría escribir algo similar a:
<?xml version="1.0" encoding="UTF-8"?>
<mar:marcadores xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.abrirllave.com/marcadores marcadores.xsd"
xmlns:mar="http://www.abrirllave.com/marcadores">
<pagina>
<nombre>Abrirllave</nombre>
<descripcion>Tutoriales de informática.</descripcion>
<url>http://www.abrirllave.com/</url>
</pagina>
<pagina>
<nombre>Wikipedia</nombre>
<descripcion>La enciclopedia libre.</descripcion>
<url>http://www.wikipedia.org/</url>
</pagina>
<pagina>
<nombre>W3C</nombre>
<descripcion>World Wide Web Consortium.</descripcion>
<url>http://www.w3.org/</url>
</pagina>
</mar:marcadores>
- "unqualified" es el valor por defecto del atributo elementFormDefault.
elementFormDefault="qualified"
EJEMPLO Si el atributo elementFormDefault se definiese "qualified", también sería válido el siguiente documento XML:
<?xml version="1.0" encoding="UTF-8"?>
<marcadores xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.abrirllave.com/marcadores marcadores.xsd"
xmlns="http://www.abrirllave.com/marcadores">
<pagina>
<nombre>Abrirllave</nombre>
<descripcion>Tutoriales de informática.</descripcion>
<url>http://www.abrirllave.com/</url>
</pagina>
<pagina>
<nombre>Wikipedia</nombre>
<descripcion>La enciclopedia libre.</descripcion>
<url>http://www.wikipedia.org/</url>
</pagina>
<pagina>
<nombre>W3C</nombre>
<descripcion>World Wide Web Consortium.</descripcion>
<url>http://www.w3.org/</url>
</pagina>
</marcadores>
Ahora, ningún elemento lleva prefijo, al igual que el espacio de nombres al que pertenecen: xmlns="http://www.abrirllave.com/marcadores"
Validación de un sitemap XML
EJEMPLO Para validar el archivo "sitemap.xml" que da solución al ejercicio de XML propuesto en el siguiente enlace:
Obsérvese que, es necesario añadir el texto resaltado que se muestra a continuación:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://www.ejemplos-de-abrirllave.com/</loc>
<lastmod>2016-09-30</lastmod>
<priority>0.8</priority>
</url>
<url>
<loc>http://www.ejemplos-de-abrirllave.com/contactar.html</loc>
<lastmod>2016-09-30</lastmod>
<priority>0.3</priority>
</url>
<url>
<loc>http://www.ejemplos-de-abrirllave.com/productos/impresora.html</loc>
<lastmod>2016-09-30</lastmod>
<priority>0.5</priority>
</url>
<url>
<loc>http://www.ejemplos-de-abrirllave.com/productos/monitor.html</loc>
<lastmod>2016-09-30</lastmod>
<priority>0.5</priority>
</url>
<url>
<loc>http://www.ejemplos-de-abrirllave.com/productos/teclado.html</loc>
<lastmod>2016-09-30</lastmod>
<priority>0.5</priority>
</url>
</urlset>
Al visualizar en un navegador web el código fuente del archivo "sitemap.xsd" ubicado en:
En pantalla se verá algo parecido a:
Nótese que, en el archivo "sitemap.xsd", la etiqueta <xsd:schema> contiene los atributos xmlns:xsd, targetNamespace, xmlns y elementFormDefault.
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
elementFormDefault="qualified">
Ejercicios |
---|