mt/src/cl/cromer/mt/LeerXML.java

168 lines
4.2 KiB
Java
Raw Normal View History

/* Copyright (c) 2017 Christopher Cromer
* Copyright (c) 2017 Carlos Faúndez
*
* This file is part of mt. It is subject to the license terms in the LICENSE file found in the top-level directory of this distribution.
* This file may not be copied, modified, propagated, or distributed except according to the terms contained in the LICENSE file.
*/
2017-07-03 20:46:11 -04:00
package cl.cromer.mt;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import javax.print.Doc;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.*;
/**
* Esta clase puede abrir y validar un archivo de XML. Se necesita un archivo mtbase_.dtd
*/
class LeerXML {
/**
* El metodo va a verificar que el archivo existe y que contiene XML valido. Si es valido devuelve el documento.
*
* @param archivo Es el archivo a abrir.
*
* @return Devuelve un document de XML o null si hay algun error.
*/
Document leerArchivo(File archivo) {
if (archivo == null) {
return null;
}
if (!archivo.exists()) {
MT.mostrarMensaje("Error", "Archivo " + archivo.getName() + " no existe!");
return null;
}
2017-07-03 18:08:53 -04:00
Document dc = createDocument(archivo);
2017-07-04 23:34:45 -04:00
if (dc == null) {
2017-07-03 18:08:53 -04:00
return validarXML(archivo);
}
return dc;
}
/**
* Crear un documento de XML
*
* @param archivo Es el archivo XML
*
* @return Retorna un document del XML o null si hay algun error.
*/
private Document createDocument(File archivo) {
Document documento;
try {
if (!archivo.exists()) {
MT.mostrarMensaje("Error", "Archivo " + archivo.getName() + " no existe!");
return null;
}
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(true);
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
documento = db.parse(archivo);
documento.getDocumentElement().normalize();
if(validarEtiquetas(documento)){
return documento;
}
return null;
}
catch (Exception e) {
if (e.getMessage().contains(".dtd")) {
return validarXML(archivo);
}
2017-07-03 21:41:26 -04:00
MT.mostrarMensaje("Error", "El archivo " + archivo.getName() + " no contiene xml valido!");
System.out.println(e.getMessage());
e.printStackTrace();
return null;
}
}
/**
* Este metodo se usa para validar el XML.
*
* @param original es el archivo original del XML
*
2017-06-24 22:14:06 -04:00
* @return Retorna un document de un XML arreglado, null si el xml no es coherente a lo que se pide
*/
private Document validarXML(File original) {
File temp = fixXML(original);
if (temp == null) {
return null;
}
Document documento = createDocument(temp);
if (!temp.delete()) {
MT.mostrarMensaje("Error", "No se puede borrar el archivo " + temp.getName());
}
if (documento != null) {
return documento;
}
return null;
}
/**
2017-06-24 22:14:06 -04:00
* Arreglar el archivo de XML si no es valido.
*
2017-06-24 22:14:06 -04:00
* @param original Es el archivo XML sin cambios
*
2017-06-24 22:14:06 -04:00
* @return un file de XML adaptado para ser validado
*/
private File fixXML(File original) {
String aux;
File temp;
try {
temp = new File("temp.xml");
BufferedReader br = new BufferedReader(new FileReader(original));
BufferedWriter bw = new BufferedWriter(new FileWriter(temp));
if ((aux = br.readLine()).startsWith("<?xml")) {
bw.write(aux + "\n<!DOCTYPE root SYSTEM \"mtbase_.dtd\">");
}
else {
bw.write("<!DOCTYPE root SYSTEM \"mtbase_.dtd\">\n" + aux);
}
for (aux = ""; aux != null; aux = br.readLine()) {
if (!aux.startsWith("<!DOCTYPE")) {
bw.write(aux + "\n");
}
}
bw.close();
}
catch (Exception e) {
return null;
}
return temp;
}
/**
* Valida las etiquetas en el XML
*
* @param document XML a analizar
*
* @return Verdadero si esta correcto, caso contrario falso
*/
private boolean validarEtiquetas(Document document) {
NodeList etiquetas = document.getElementsByTagName("*");
for (int i = 0; i < etiquetas.getLength(); i++) {
switch (etiquetas.item(i).getNodeName()) {
case "root":
break;
case "transicion":
break;
case "qi":
break;
case "si":
break;
case "qj":
break;
case "sj":
break;
case "movimiento":
break;
default:
return false;
}
}
return true;
}
}