Você está na página 1de 4

Plantillas Web

Webmaker te lo pone fcil: tu web profesional en tres sencillos pasos


www.arsys.es

inicio blog artculos

Gua de XML

Validar documentos XML usando XSD


Aqu se presentan las diversas formas de validar un documento XML
usando un esquema XSD (XML Schema Definition): con Ant, con
libXML y mediante cdigo Java.

Validacin con esquema (XSD)


Las DTD son parte de SGML, por lo que con ellas pueden definirse lenguajes
XML y tambin otros que no lo sean, como HTML 4.01 que no es XML pero se
define con una DTD. Observar que en HTML 4.01 hay elementos que no
requieren etiqueta de cierre, como <br> o <input>, esta sintaxis no es correcta
en XML.
XML dispone de su propio sistema de definicin: XSD (XML Schema Definition).
Con XSD puede definirse un lenguaje XML con un nivel de detalle mucho mayor
del que permite DTD, por ejemplo, XSD permite especificar el tipo de dato que
contendr cada elemento o atributo, como fechas, enteros o incluso
expresiones regulares.
El sistema XSD est inspirado en los lenguajes de programacin orientados a
objetos. Una XSD es una instancia del esquema XMLSchema, adems los XML
finales basados en el XSD se consideran instancias del XSD. Para implementar
la instanciacin de documentos, se introduce el concepto de espacio de nombres
(namespace):
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:test:biblioteca"
...>

Esta declaracin en el XSD indica que el XSD en s es una instancia de


XMLSchema (y se indica la URL donde encontrarlo). La declaracin indica
tambin que el XSD crea un nuevo lenguaje en el espacio de nombres indicado
por targetNamespace, y en este caso se indica con un URN. Los documentos
finales, basados en este XSD debern declarar que usan este espacio de
nombres con
<?xml version="1.0" encoding="UTF-8"?>
<biblioteca xmlns="urn:test:biblioteca">
...
</biblioteca>

en lugar de declarar la DTD.


El XSD para el XML del ejemplo es:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="urn:test:biblioteca"
targetNamespace="urn:test:biblioteca"
elementFormDefault="qualified">
<xsd:element name="biblioteca">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="libro" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="libro">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="titulo" maxOccurs="unbounded"/>
<xsd:element ref="autor"/>
<xsd:element ref="id"/>
<xsd:element ref="paginas" minOccurs="0"/>

1. Introduccin a XML
2. Validar documentos
XML usando XSD
3. Transformar
documentos XML
usando XSLT

</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="titulo">
<xsd:complexType>
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="lang" type="xsd:string" use="required"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:element>
<xsd:element name="autor" type="xsd:string"/>
<xsd:element name="id" type="idType"/>
<xsd:element name="paginas" type="xsd:positiveInteger"/>
<!-- definiciones de tipo, til para crear varios elementos del mismo tipo -->
<xsd:complexType name="idType">
<xsd:attribute name="isbn" type="xsd:string" use="required"/>
<xsd:attribute name="bib" type="xsd:integer"/>
</xsd:complexType>
</xsd:schema>

Se observa que el XSD es ms complejo que la DTD, pero a cambio permite


definir el nuevo lenguaje XML a un nivel de detalle muy superior que la DTD.
Adems, el XSD est escrito en XML, por lo que los procesadores y validadores
del propio XSD pueden reutilizar cdigo y beneficiarse de la sencillez de
procesado de XML.
Notas:
La declaracin xmlns=urn:test:biblioteca indica que usaremos los
nombres definidos en el XSD.
Al definir un elemento, si no se especifican minOccurs o maxOccurs, se
considera que estas valen 1. El valor maxOccurs=unbounded indica
que no hay lmite superior.
Al definir un atributo, use=required indica que dicho atributo es
obligatorio, por defecto se asume que un atributo es opcional, aunque
tambin se puede indicar con use=optional.
Las definiciones de tipo se pueden extraer, como se ha hecho con el tipo
idType, que define un tipo para todos los id. Procediendo as, se puede
reutilizar dicha definicin de tipo para varios elementos.

Validar el XSD usando Ant


El siguiente objetivo Ant valida un XML a partir de un XSD:
<target name="xsd-validator-namespace">
<schemavalidate file="xmlfiles/bib1.xml">
<schema namespace="urn:test:biblioteca" file="xmlfiles/biblioteca.xsd"/>
</schemavalidate>
</target>

Validar el XSD usando libXML


La siguiente instruccin valida el fichero XML bib1.xml usando el fichero XSD
biblioteca.xsd:
xmllint --noout --schema biblioteca.xsd bib1.xml

Validar el XSD desde Java


El siguiente bloque de cdigo Java carga el documento bib1.xml, su XSD
correspondiente biblioteca.xsd, y valida en XML con el XSD:
try
{
// crear y configurar la factory de parsers de documentos XML
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true); // activar soporte para namespaces
// cargar el documento XML
DocumentBuilder parser = dbf.newDocumentBuilder();

Document doc = parser.parse(new File("bib1.xml"));


// crear una SchemaFactory preparada para interpretar esquemas XML W3C
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
// cargar el esquema XSD
Schema schema = sf.newSchema(new File("biblioteca.xsd"));
// crear el objeto validator, que ser el responsable de validar el XML
Validator validator = schema.newValidator();
// validar el documento XML
validator.validate(new DOMSource(doc));
// si se llega a este punto, el documento es vlido
System.out.println("DOCUMENTO VLIDO");
}
catch (SAXException e)
{
// esta excepcin indica fallo de validacin
System.err.println("DOCUMENTO INVLIDO");
e.printStackTrace();
}
catch (ParserConfigurationException e)
{
// errores en la configuracin del parser
e.printStackTrace();
}
catch (IOException e)
{
// errores de lectura
e.printStackTrace();
}

Validaciones XSD sin espacios de nombres


Un documento XML sin espacio de nombres se escribe como:
<?xml version="1.0" encoding="UTF-8"?>
<biblioteca>
...
</biblioteca>

Al especificar el lenguaje con un XSD, se hace igual que cuando se usan


espacios de nombres, simplemente omitiendo los atributos targetNamespace y
xmlns en el elemento xsd:schema, que quedar como
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
...

Con Ant, se validar indicando que el XSD no declara un espacio de nombres:


<target name="validar">
<schemavalidate file="bib1.xml" noNamespaceFile="biblioteca.xsd"/>
</target>

Con xmllint la sintaxis de la instruccin no cambia:


xmllint --noout --schema biblioteca.xsd bib1.xml

Finalmente, en Java, el cdigo de validacin es el mismo, pero podemos omitir


la instruccin
dbf.setNamespaceAware(true);

es decir, dejar el valor por defecto (false) para namespaceAware. La propiedad


namespaceAware indica al parser si debe tener en cuenta o no los espacios de
nombres. Es necesario establecer a true esta propiedad si se usan espacios de
nombres, si no se usan su valor es indiferente y es correcto dejar el valor por
defecto.
siguiente Transformar documentos XML usando XSLT

Copyright 2006-2012 bitriding.com webmaster@bitriding.com

Você também pode gostar