Implementados metodos para validar la integridad de un xml valido para el proyecto. Tambien agregados xmls de prueba

This commit is contained in:
carlos 2017-06-24 16:45:22 +00:00
parent 18c824ff6b
commit fb09ee568a
11 changed files with 193 additions and 10 deletions

3
mt.xml
View File

@ -1,3 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
<transicion>
<qi>0</qi>
@ -13,4 +14,4 @@
<sj>1</sj>
<movimiento>R</movimiento>
</transicion>
</root>
</root>

7
mtbase.dtd Normal file
View File

@ -0,0 +1,7 @@
<!ELEMENT root (transicion+)>
<!ELEMENT transicion (qi,si,qj,sj,movimiento)>
<!ELEMENT qi (#PCDATA)>
<!ELEMENT si (#PCDATA)>
<!ELEMENT qj (#PCDATA)>
<!ELEMENT sj (#PCDATA)>
<!ELEMENT movimiento (#PCDATA)>

View File

@ -7,10 +7,16 @@
package mt;
import java.io.File;
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;
@ -18,7 +24,7 @@ import jdk.internal.org.xml.sax.SAXParseException;
import org.w3c.dom.Document;
/**
* Esta clase puede abrir y validar un archivo de xml.
* Esta clase puede abrir y validar un archivo de xml. Se necesita un archivo mtbase.dtd
*/
class LeerXML {
@ -26,9 +32,26 @@ 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 habia algun error.
* @return Devuelve un document de xml o null si hay algun error.
*/
Document leerArchivo(File archivo) {
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!");
@ -36,16 +59,21 @@ class LeerXML {
}
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(false);
dbf.setValidating(true);
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
db.setErrorHandler(new SimpleErrorHandler());
Document document = db.parse(archivo);
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;
@ -53,10 +81,48 @@ class LeerXML {
}
/**
* Esta clase se usa para validar que el xml es valido.
*
* @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("<?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;
}
/**
* Esta clase se usa para comprobar que el xml es valido.
*/
protected class SimpleErrorHandler implements ErrorHandler, org.xml.sax.ErrorHandler {
public boolean error = false;
/**
* Un warning
* @param e La excepción
@ -73,6 +139,7 @@ class LeerXML {
*/
public void error(SAXParseException e) throws SAXException {
System.out.println(e.getMessage());
error = true;
}
/**
@ -82,6 +149,7 @@ class LeerXML {
*/
public void fatalError(SAXParseException e) throws SAXException {
System.out.println(e.getMessage());
error = true;
}
/**
@ -100,6 +168,7 @@ class LeerXML {
@Override
public void error(org.xml.sax.SAXParseException e) {
System.out.println(e.getMessage());
error = true;
}
/**
@ -109,6 +178,7 @@ class LeerXML {
@Override
public void fatalError(org.xml.sax.SAXParseException e) {
System.out.println(e.getMessage());
error = true;
}
}
}

View File

@ -49,6 +49,13 @@ public class MT extends Application {
Document document = xml.leerArchivo(archivo);
if (document != null) {
System.out.println(document.getDocumentElement().getNodeName());
for(int i=0;i<document.getElementsByTagName("transicion").getLength();i++){
System.out.println("("+document.getElementsByTagName("qi").item(i).getTextContent()+","+
document.getElementsByTagName("si").item(i).getTextContent()+") = ("+
document.getElementsByTagName("qj").item(i).getTextContent()+","+
document.getElementsByTagName("sj").item(i).getTextContent()+","+
document.getElementsByTagName("movimiento").item(i).getTextContent()+")");
}//Ciclo base para obtener la función completa de las transiciones
}
}
};

6
xmltest/Descriptions Normal file
View File

@ -0,0 +1,6 @@
mT.xml : Caso ideal, con <?xml> y <!DOCTYPE> definidos correctamente
mT1.xml : No definidos <?xml> y <!DOCTYPE>, pero las transiciones con correctas
mT2.xml : <?xml> definido, pero <!DOCTYPE> es un archivo distinto
mT3.xml : <?xml> definido, pero <!DOCTYPE> no lo esta
mT4.xml : <?xml> y <!DOCTYPE> definidos correctamente, pero las transiciones estan errados
mtbase.dtd : Base para validar xml

18
xmltest/mT.xml Normal file
View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE root SYSTEM "mtbase.dtd">
<root>
<transicion>
<qi>0</qi>
<si>0</si>
<qj>0</qj>
<sj>0</sj>
<movimiento>R</movimiento>
</transicion>
<transicion>
<qi>0</qi>
<si>1</si>
<qj>1</qj>
<sj>1</sj>
<movimiento>R</movimiento>
</transicion>
</root>

16
xmltest/mT1.xml Normal file
View File

@ -0,0 +1,16 @@
<root>
<transicion>
<qi>0</qi>
<si>0</si>
<qj>0</qj>
<sj>0</sj>
<movimiento>R</movimiento>
</transicion>
<transicion>
<qi>0</qi>
<si>1</si>
<qj>1</qj>
<sj>1</sj>
<movimiento>R</movimiento>
</transicion>
</root>

18
xmltest/mT2.xml Normal file
View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE root SYSTEM "tmbase.dtd">
<root>
<transicion>
<qi>0</qi>
<si>0</si>
<qj>0</qj>
<sj>0</sj>
<movimiento>R</movimiento>
</transicion>
<transicion>
<qi>0</qi>
<si>1</si>
<qj>1</qj>
<sj>1</sj>
<movimiento>R</movimiento>
</transicion>
</root>

17
xmltest/mT3.xml Normal file
View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
<transicion>
<qi>0</qi>
<si>0</si>
<qj>0</qj>
<sj>0</sj>
<movimiento>R</movimiento>
</transicion>
<transicion>
<qi>0</qi>
<si>1</si>
<qj>1</qj>
<sj>1</sj>
<movimiento>R</movimiento>
</transicion>
</root>

16
xmltest/mT4.xml Normal file
View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE root SYSTEM "mtbase.dtd">
<root>
<transicion>
<si>0</si>
<qj>0</qj>
<sj>0</sj>
<movimiento>R</movimiento>
</transicion>
<transicion>
<qi>0</qi>
<si>1</si>
<qj>1</qj>
<movimiento>R</movimiento>
</transicion>
</root>

7
xmltest/mtbase.dtd Normal file
View File

@ -0,0 +1,7 @@
<!ELEMENT root (transicion+)>
<!ELEMENT transicion (qi,si,qj,sj,movimiento)>
<!ELEMENT qi (#PCDATA)>
<!ELEMENT si (#PCDATA)>
<!ELEMENT qj (#PCDATA)>
<!ELEMENT sj (#PCDATA)>
<!ELEMENT movimiento (#PCDATA)>