/* 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. */ package mt; import java.io.*; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import javax.xml.stream.util.StreamReaderDelegate; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; import jdk.internal.org.xml.sax.ErrorHandler; import jdk.internal.org.xml.sax.SAXException; import jdk.internal.org.xml.sax.SAXParseException; import org.w3c.dom.Document; /** * 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. */ public Document leerArchivo(File archivo) { if(!archivo.exists() || !archivo.getName().endsWith(".xml")){ System.out.println("Archivo "+archivo.getName()+" no existe o no es compatible"); return null; } Document dc = createDocument(archivo); if(dc == null) return validarXML(archivo); return dc; } /** * * @param archivo Es el archivo Xml * @return Retorna un document del xml o null si hay algun error. */ private Document createDocument(File archivo){ Document document; try { if (!archivo.exists()) { System.out.println("El archivo " + archivo.getName() + " no existe!"); return null; } DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setValidating(true); dbf.setNamespaceAware(true); DocumentBuilder db = dbf.newDocumentBuilder(); SimpleErrorHandler seh = new SimpleErrorHandler(); db.setErrorHandler(seh); document = db.parse(archivo); if(seh.error) return null; document.getDocumentElement().normalize(); return document; } catch(Exception e) { if(e.getMessage().indexOf(".dtd") >= 0) { return validarXML(archivo); } System.out.println(e.getMessage()); e.printStackTrace(); return null; } } /** * * @param original es el archivo original del xml * @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); Document document = createDocument(temp); temp.delete(); if(document != null) return document; return null; } /** * * @param original Es el archivo xml sin cambios * @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(""); }else{ bw.write("\n"+aux); } for(aux = "";aux != null;aux = br.readLine()){ if(!aux.startsWith("