Tutoriales de informática - Abrirllave.com

Abrirllave.com

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>

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:

Fíjese también que:

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 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>

Elementos globales y locales en XSD

Los elementos pueden ser globales o locales:

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>

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:

Código fuente del archivo sitemap.xsd

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