0% encontró este documento útil (0 votos)
12 vistas4 páginas

PRACTICA1 5-ValidarXML

Cargado por

thecuenca369
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
12 vistas4 páginas

PRACTICA1 5-ValidarXML

Cargado por

thecuenca369
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 4

Acceso a datos IES Virrey Morcillo Curso 2024-2025

EJEMPLO 5: VALIDAR XML CON XSD


Objetivo
Partir de un XML validado por XSD.

Desarrollo de la práctica
Usaremos un XML Schema para garantizar que el formato del documento XML que vamos a
leer es óptimo. Es una manera de saber lo que nos puede llegar a nuestro problema, y si no es
así, controlarlo antes de que lo tratemos.

Tomaremos de nuevo el ejemplo inicial que trataba el XML Libros.xml, y modificaremos el


método abrirXMLaDOM (en otros ejemplos, habrá que hacerlo en el constructor de la clase
correspondiente).

1. Añadiremos el siguiente XSD al proyecto, junto a Libros.xml:

<?xml version="1.0" encoding="UTF-8"?>


<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- Definimos el elemento raíz Libros -->


<xs:element name="Libros">
<xs:complexType>
<xs:sequence>
<!-- Un libro puede aparecer una o más veces -->
<xs:element name="Libro" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<!-- El elemento "Titulo" es obligatorio -->
<xs:element name="Titulo" type="xs:string" minOccurs="1"
maxOccurs="1"/>
<!-- El elemento "Autor" es obligatorio -->
<xs:element name="Autor" type="xs:string" minOccurs="1"
maxOccurs="1"/>
</xs:sequence>
<!-- El elemento "Libro" tiene un atributo "publicado" de
tipo año -->
<xs:attribute name="publicado" type="xs:gYear"
use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>

</xs:schema>

1
José Manuel Brazález Segovia
Acceso a datos IES Virrey Morcillo Curso 2024-2025

2. Importaremos las clases siguientes:

import javax.xml.validation.SchemaFactory;

import javax.xml.XMLConstants;

import org.xml.sax.SAXException;

3. Modificamos el método abrirXMLaDOM con las líneas en rojo y añadiremos el método


privado loadSchema:

public int abrirXMLaDOM(File f) {


try {
System.out.println("Abriendo archivo XML file y generando DOM ....");

//creamos nuevo objeto DocumentBuilder al que apunta la variable factory


DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//ignorar comentarios y espacios blancos
factory.setIgnoringComments(true);
factory.setIgnoringElementContentWhitespace(true);

factory.setNamespaceAware(true);
factory.setValidating(false); // Usamos XSD, no DTD
factory.setSchema(loadSchema("Libros.xsd")); // Especificamos XSD
//DocumentBuilder tiene el método parse que es el que genera DOM en
memoria
DocumentBuilder builder = factory.newDocumentBuilder();
doc = builder.parse(f);
// ahora doc apunta al arbol DOM y podemos recorrerlo
System.out.println("DOM creado con éxito.");
return 0;//si el método funciona
} catch (IOException | ParserConfigurationException | SAXException e) {
System.out.println(e);
return -1;//if the method aborta en algún punto
}
}

// Método para cargar el esquema XSD


private static Schema loadSchema(String schemaPath) throws SAXException {
SchemaFactory factory =
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
return factory.newSchema(new File(schemaPath));
}

4. Probaremos si funciona en la clase como antes, con Libros.xml sin modificar, y luego
haciendo algunas modificaciones en el XML para probar que efectivamente no pasa la

2
José Manuel Brazález Segovia
Acceso a datos IES Virrey Morcillo Curso 2024-2025

validación (por ejemplo: cambiando el orden de título/autor, eliminando un elemento


título, metiendo otro elemento que no sea libro…)

5. ¿Qué harías para que el resto del programa no se ejecute al no validarse el XML?

6. Para el validar el documento de nuevo, ANTES de escribir, tendremos que actualizar el


método guardarDOMcomoArchivo:

// Crea un nuevo archivo xml del DOM en memoria


public void guardarDOMcomoArchivo(String nuevoArchivo) {
try {
// Cargar esquema XSD para la validación
Schema schema = loadSchema("Libros.xsd"); // Asegúrate de que la ruta
del esquema sea correcta
Validator validator = schema.newValidator();

// Validar el DOM antes de guardarlo


try {
validator.validate(new DOMSource(doc));
System.out.println("El DOM es válido según el esquema XSD.");

// Definir el origen y el resultado para la transformación


Source src = new DOMSource(doc);
StreamResult rst = new StreamResult(new File(nuevoArchivo));

// Crear Transformer para convertir el DOM a un archivo XML


Transformer transformer =
TransformerFactory.newInstance().newTransformer();

// Opciones de formato del archivo XML


transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-
amount", "4");

// Guardar el archivo XML


transformer.transform(src, rst);

System.out.println("Archivo creado del DOM con éxito\n");


} catch (IOException | IllegalArgumentException | TransformerException |
SAXException e) {
System.out.println("Error de validación: " + e.getMessage());
}
} catch (IllegalArgumentException | SAXException e) {
e.printStackTrace();
}
}

3
José Manuel Brazález Segovia
Acceso a datos IES Virrey Morcillo Curso 2024-2025

4
José Manuel Brazález Segovia

También podría gustarte