Validar XML

Estoy trabajando con Java y archivos XML, en principio, cuando aun no
tenia conocimiento de Jdom, realice un archivo XML con la clase
FileWriter de Java que en teoría no me debería dar problemas ya que
escribe en caracteres ASCII, pero resulta que el archivo aunque esta
bien armado no esta validado, os pongo un trozo pequeño pero que
describe mi método de escritura por si estoy incluyendo algo incorrecto
como el separador de linea:
java.io.FileWriter fw= new java.io.FileWriter("c:/doc.xml");
fw.write("<?xml version=\"1.0\" encoding=\"iso-8859-1\" standalone=\"yes\" ?>");
fw.write("<PERSONA>");
fw.writeln(rs.getString(1));
fw.write("</NUMERO>");
fw.write(System.getProperty("line.separator"));
fw.write("<NOMBRE>");
fw.write(rs.getString(2));
fw.write("</PERSONA>");
Se puede utilizar esta clase de Java para escribir archivos xml ¿? ¿? ¿AL
parecer me han comentado que mi documento no esta bien validado pero lo
abrí con el bloc de notas y no veo donde puede estar el fallo la
verdad...? ¿?
De todas formas me gustaría saber de un buen programa para validar mis documentos.
Paralelamente estoy trabajando con JDOM, por si no es válido mi método de trabajo.

3 Respuestas

Respuesta
1
Trabajar con JDOM es, para mí, más sencillo que trabajar con File. Write, porque JDOM construye clases que representan los distintos objetos del fichero XML, así cuando escribes el fichero u obtienes el texto que representa al fichero XML todas las TAGS están cerradas.
Por el código que tienes parece que el fallo pueda estar en alguna TAG mal formada.
No aparece el contenido de "rs.getString(1)" o "rs.getString(2)", por lo que igual las TAGS NUMERO o NOMBRE no están abiertas o cerradas correctamente.
También puede ser que el fichero no se escriba correctamente al utilizar codificación latina (letras con tildes, la letra ñ,...) y no te convierta bien los Strings a UTF8.
El contenido del fichero XML de salida sería de ayuda ;)
Hola¡
Después de andar googleando creo que el problema es que ponía esto:
fw.write(System.getProperty("line.separator"));
Y claro escribía un carácter de control que yo no veía, pero luego hice este código, para solucionarlo:
java.io.FileWriter fw= new java.io.FileWriter("c:/doc.xml");
PrintWriter print = new PrintWriter (fw);
print.println("");
print.print("");
print.print(" "+variablenombre+" ");
print.println("
print.println("");
print.close();
Las pruebas que estoy haciendo con Jdom, me condicionan siempre este encabezamiento:
<?xml version="1.0" encoding="UTF-8" ?>
Este es el codigo que tengo:
Document doc = new Document();
Element persona = new Element("PERSONA");
Element fechageneracion = new Element ("NOMBRE");
variablenombre.setText("Marcos");
ssrsm.addContent(variablenombre);
doc.setRootElement(persona);
XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
FileWriter writer = new FileWriter(new File("doc.xml"));
outputter.output(doc, writer);
?¿???¿Como tengo que hacer para ponerle mi encabezamiento?¿?¿
<?xml version=\"1.0\" encoding=\"iso-8859-1\" standalone=\"yes\" ?>
Hola
Perdona pero el código del print.print, el procesador de textos me lo puso mal y me boor el contendo dentro de las comillas dobles sorry, ¿pero bueno me gustaría saber el tema del encabezado si se lo puedo incluir yo a mi manera? ¿? ¿? ¿?
¿Pero en principio con ese método seria correcto no? ¿? Ya que esa clase escribe caracteres en formato Ascii y Unicode..
¿De todas formas me interesa saber más de Jdom donde puedo encontrar alguna página con buenos ejemplos? ¿? ¿
Muchas gracias de nuevo y un saludo
// Cambiar el encabezado en JDOM
"format.setEncoding() en la instancia Format que le pasas al XMLOutputter."
http://www.jdom.org/pipermail/jdom-interest/2006-February/015194.html
// Tutos... Estan en inglés :(
http://www.javaworld.com/javaworld/jw-05-2000/jw-0518-jdom.html
http://www.javaworld.com/javaworld/jw-07-2000/jw-0728-jdom2.html
Hola no me funciona quiero ponerle este encabezamiento y no me va:
<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
Como seria...¿? ¿
Sobre la codificación, para obtener el encoding="iso-8859-1" en lugar de:
XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
seria:
Format format = new Format();
format.setEnconding("iso-8859-1");
XMLOutputter outputter = new XMLOutputter(format);
El standalone con JDOM y XMLOutputter..¿.?
Realmente el parámetro standalone no es necesario para procesar un XML.
Indica si se puede procesar un fichero de forma independiente (yes) o si por el contrario es dependiente de otros ficheros (no - opción por defecto).
Así, no creo que de problemas si evitas el standalone="yes".
Respuesta
1
Según tu código,
fw.write("<PERSONA>");
fw.writeln(rs.getString(1));
fw.write("</NUMERO>");
fw.write(System.getProperty("line.separator"));
fw.write("<NOMBRE>");
fw.write(rs.getString(2));
fw.write("</PERSONA>");
Escribiría lo siguiente:
<PERSONA>
algo
</NUMERO>
<NOMBRE>
algo
</PERSONA>
Te faltaría escribir el tag de apertura del elemento NUMERO y el tag de cierre de NOMBRE
fw.write("<PERSONA>");
fw.write("<NUMERO>");
fw.writeln(rs.getString(1));
fw.write("</NUMERO>");
fw.write(System.getProperty("line.separator"));
fw.write("<NOMBRE>");
fw.write(rs.getString(2));
fw.write("</NOMBRE>");
fw.write("</PERSONA>");
Puedes usar writeln para que te escriba despues de la cadena pasada como parámetro un salto de línea. Así te evitas la línea fw.write(System.getProperty("line.separator"));
Para saber si está bien válido puedes abrirlo con Internet Explorer o Firefox y te indicará el error.
Yo uso un programa llamado CookTop (freeware) que también te puede ayudar, sobre todo si te metes en el mundo de las plantillas XSL.
Hace mucho que no uso Java, pero si es una clase que escribe texto plano funcionará perfectamente.
Hola¡
Ante todo gracias por la ayuda prestada, se agradece la verdad, y segundo, comentarte que la Clase FileWriter, ya que escribe texto en formato ASCII o Unicode, y sino me equivoco es totalmente válido para XML, finalmente utilice este código, por si alguna vez te hace falta saberlo:
java.io.FileWriter fw= new java.io.FileWriter("c:/doc.xml");
PrintWriter  print = new PrintWriter (fw);
print.println("<?xml version=\"1.0\" encoding=\"iso-8859-1\" standalone=\"yes\"?>");
print.println("<PERSONA>");
print.print("<NOMBRE>");
print.print(" "+variablenombre+" ");
print.println("</NOMBRE>");
print.println("</PERSONA>");
print.cloe();
No te fíes del código que puse arriba, me tendrás que disculpar que lo escribí mal, el problema que tenia era con el salto de linea que le metía, creo yo..
Ya que writeln no existe como método, dentro de dicha clase, pero esto hace lo mismo, uno de los problemas que estaba teniendo antes, era que al meterele el separador de linea le estaba escribiendo un carácter de control y claro a ponerlo en el explorer funcionaba pero al parecer no era válido, tampoco sabia que había que dejar espacios a ambos lados de los iguales y que no se podía poner acentos, ¿dónde puedo mirar todas estas restricciones? ¿? ¿
Sin embargo algo que me deja mosca y que no entiendo ¿? ¿? ¿Es por que el primer doc que cree con ese separador de linea no válido me lo leyó bien incluso con acentos en el explorer? ¿? ¿? ¿Ahí qué configurar algo que yo no sepa para hacerlo más estricto a la hora de validar el documento? ¿? ¿?
Por lo que me han contado si al cargarlo en el IE7 si sale la ventanita de que se va ejecutar un script, es que es válido ya que xml es un script... es verdad ¿? ¿? ¿Por qué me salia igual con el otro documento no válido? ¿?
Ando algo perdida con esto de validarlo, ya que como ves arriba, no parto de una plantilla DTD, ¿qué normas debo de seguir para a parte de formarlo bien que sea válido? ¿? ¿?
Un saludo y gracias por atender a esta pobre pesada ¡
A ver si no me dejo ninguna pregunta.
No necesitas partir de ninguna plantilla DTD. Una plantilla de ese tipo restringe el contenido del xml. Es decir, puedes "obligar" a que en un documento xml asociado a una plantilla DTD (o a un schema) tenga una serie de elementos. Por ejemplo, que en la raíz haya un elemento "Persona" y que éste tenga un nodo hijo "nombre".
No tiene nada que ver con que un xml este bien formado.
Si que puedes poner tildes y otro tipo de caracteres especiales ¿Cuál podría ser el problema de que no te validara? Que java te escriba en una codificación distinta a la que has especificado en el documento: encoding="iso-8859-1". Si alguna vez te pasa, prueba con otras codificaciones, por ejemplo UTF-8. Lo de los espacios a ambos lados de los iguales no sé a que te refieres.
En http://www.w3.org/XML tienes información detallada sobre las especificaciones de un documento XML. Es un poco aburrido pero si tienes alguna duda concreta te puede ayudar.
Me he bajado el JDK y he probado tu código y funciona bien. [He corregido el print.cloe() por print.close()]
Un documento xml no es un script. Son sólo datos, no hay código ejecutable que pueda actuar sobre tu ordenador.
¿Por qué te dice Internet Explorer que debes confirmar la ejecución de un script?. Porque cuando abres un documento xml, a grandes rasgos, IE le asocia un código html con javascript (qué si que es un código ejecutable) para que puedas ver más bonito el xml y contraer y expandir los nodos. Cualquier página que abras en local que tenga javascript te pedirá que confirmes su ejecución.
Puedes ser todo lo pesada que necesites ser :) Si tienes alguna duda o me he dejado algo me dices.
Hola
Lo del explorer lo digo por que, cada vez que cargo un archivo xml tanto en el IE6 como en el IE7, incluido el archivo generado con el código de arriba me salta una ventanita que dice lo siguiente:
"Para ayudar a proteger su seguridad, Internet Explorer impidió que esta página ejecutara scripts o controles ActiveX que podrían tener Acceso al equipo. Haga clic para ver opciones"
Me imagino que sera de algún tema relacionado con el tema de la seguridad de windows.
Entonces si el código de arriba sale correcto con la codificación iso, y lo has hecho en Java, deduzco, ¿qué por lógica Java lo escribe bien no? ¿? ¿?
Si, java lo escribe bien. ¿A ti también te funciona verdad?
Lo del Script que te sale en IE es por lo que te he comentado. Para ejecutar un script de una página local te pide permiso por seguridad.
Al cargar un xml (sin hoja XSL asociada) en IE le asocia un Javascript para que se vea mejor en el explorador. Y para ejecutar ese javascript pues te pide permiso. Pero eso no significa que el xml sea un script. Un xml no puede dañar el ordenador.
Respuesta
1
Siento no haber respondido antes la pregunta.
Por si todavía tienes la duda, te comento que estás utilizando una manera "tosca" de crear tu archivo xml, es decir, utilizas una clase de java que te permite escribir datos de cualquiera tipo (tanto texto como binario) en un archivo. Hay otras clases más especializadas para hacer ésto, que comprueban si tu estructura xml es válida.
Dado que la pregunta es ya antigua (lo siento de nuevo) te redirijo a unos documentos públicos de la universidad de Stuttgart que te vendrán bien, se trata de los temas 5, 6 y 7 de la asignatura "Webbased applications & e-commerce" que puedes encontrar en el siguiente enlace:
http://www.ipvs.uni-stuttgart.de/abteilungen/as/lehre/lehrveranstaltungen/vorlesungen/WS0506/NBA/NBA_termine/start/en
Hola, no te preocupes gracias de todas formas por responder, comnetarte que al final utilice Jdom no se si esta bien empleado pero funciono, de todas formas solo tenia que escribir, un documento xml, sin utilizar plantillas ni nada, aunque es un poco tosca la forma de arriba el xml no es texto plano, que problemas ves tu de emplear la clase de arriba, un saludo
Si al final utilizaste JDOM, hiciste muy bien. En cuanto a utilizar FileWriter, es una opción muy simple, que sólo veo correcta para crear ficheros xml muy simples. Si tienes que crear un xml más complejo, JDOM ( o cualquiera de las tecnologías que se comentan el los textos a los que te referí) será bastante más apropiado, ya que comprobará que el xml es correcto.
Por cierto, xml es "texto plano" en cuanto que sólo utiliza caracteres alfanuméricos y no requiere de un programa especial para verlo y modificarlo (cualquier editor de textos valdrá).
Mucha suerte con tu trabajo.
Un saludo.
Dani
PD: Si no tienes más dudas te agradecería que marcases el hilo como "cerrado".

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas