
XML from java
Hola
Estoy realizando una aplicación donde realizo una consulta a una base de datos access y vuelco la consulta y ademas con esa consulta se puede realizar un documento en formato xml. Se que existen librerías como DOM y SAx, ademas del manejo de archivos del propio java, Xerces... Mi pregunta es... Cual me recomiendas utilizar, voy a trabajar con un gran volumen de datos (no quiero que sea una mula lenta ), y por ultimo como seria el código para coger los datos de la consulta y pasarlos a un método que genere el XML, muchas gracias por la ayuda y un saludo
Estoy realizando una aplicación donde realizo una consulta a una base de datos access y vuelco la consulta y ademas con esa consulta se puede realizar un documento en formato xml. Se que existen librerías como DOM y SAx, ademas del manejo de archivos del propio java, Xerces... Mi pregunta es... Cual me recomiendas utilizar, voy a trabajar con un gran volumen de datos (no quiero que sea una mula lenta ), y por ultimo como seria el código para coger los datos de la consulta y pasarlos a un método que genere el XML, muchas gracias por la ayuda y un saludo
1 respuesta
Respuesta de krlosnow
1
1

krlosnow, Mas de 15 años de experiencia en Java, Javascript y HTML
El uso de DOM y SAX es para cuando tienes un fichero XML y quieres importarlo a un árbol de objetos java. Tu caso es el contrario: quieres serializar a XML unos datos que tienes en Java.
Supongo que usarás JDBC para obtener los datos, y tendrás el resultado de la consulta en un resultset rs. Yo lo que haría sería lo siguiente:
java.io.FileWriter fw= new java.io.FileWriter("c:/consulta.xml");
fw.write("<?xml version=\"1.0\" ?>");
int numColumnas = rs.getMetaData().getColumnCount();
String[] nombreColumnas = new String[numColumnas];
for (int i=0; i<numColumnas; i++){
nombreColumnas = rs.getMetaData().getColumnName(i);
}
while(rs.next()){
fw.write(System.getProperty("line.separator"));
fw.write("<registro>");
fw.write(System.getProperty("line.separator"));
for (int i=0; i<numColumnas; i++){
fw.write(" <" + nombreColumnas + ">" + rs.getString(i) + "</" + nombreColumnas + ">");
fw.write(System.getProperty("line.separator"));
}
fw.write("</registro>");
}
fw.close();
No lo he probado, pero tiene que funcionar. Espero que te sirva. Un saludo y no olvides valorar mi respuesta ;-)
Carlos
Supongo que usarás JDBC para obtener los datos, y tendrás el resultado de la consulta en un resultset rs. Yo lo que haría sería lo siguiente:
java.io.FileWriter fw= new java.io.FileWriter("c:/consulta.xml");
fw.write("<?xml version=\"1.0\" ?>");
int numColumnas = rs.getMetaData().getColumnCount();
String[] nombreColumnas = new String[numColumnas];
for (int i=0; i<numColumnas; i++){
nombreColumnas = rs.getMetaData().getColumnName(i);
}
while(rs.next()){
fw.write(System.getProperty("line.separator"));
fw.write("<registro>");
fw.write(System.getProperty("line.separator"));
for (int i=0; i<numColumnas; i++){
fw.write(" <" + nombreColumnas + ">" + rs.getString(i) + "</" + nombreColumnas + ">");
fw.write(System.getProperty("line.separator"));
}
fw.write("</registro>");
}
fw.close();
No lo he probado, pero tiene que funcionar. Espero que te sirva. Un saludo y no olvides valorar mi respuesta ;-)
Carlos

Me da un fallo en la linea nombreColumnas = cdr.getMetaData().getColumnName(i); y no se porque, ya que esta todo bien declarado, haber si tu lo puedes ver mejor que yo, te pongo el codigo de mi método, de todas formas muchas gracias por la ayuda prestada me ha solucionado mucho la papeleta un saludo
public java.sql.ResultSet obtenerTabla(String tabla)
throws java.sql.SQLException
{
java.io.FileWriter fw= new java.io.FileWriter("c:/consulta.xml");
cdr = sentenciaSQL.executeQuery("SELECT * FROM " + tabla);
fw.write("<?xml version=\"1.0\" ?>");
int numColumnas = cdr.getMetaData().getColumnCount();
String [] nombreColumnas = new String[numColumnas];
for (int i=0; i<numColumnas; i++)
{
nombreColumnas = cdr.getMetaData().getColumnName(i);
}
while(cdr.next())
{
fw.write(System.getProperty("line.separator"));
fw.write("<registro>");
fw.write(System.getProperty("line.separator"));
for (int i=0; i<numColumnas; i++)
{
fw.write(" <" + nombreColumnas + ">" + cdr.getString(i) + "</" + nombreColumnas + ">");
fw.write(System.getProperty("line.separator"));
}
fw.write("</registro>");
}
fw.close();
return cdr;
}
public java.sql.ResultSet obtenerTabla(String tabla)
throws java.sql.SQLException
{
java.io.FileWriter fw= new java.io.FileWriter("c:/consulta.xml");
cdr = sentenciaSQL.executeQuery("SELECT * FROM " + tabla);
fw.write("<?xml version=\"1.0\" ?>");
int numColumnas = cdr.getMetaData().getColumnCount();
String [] nombreColumnas = new String[numColumnas];
for (int i=0; i<numColumnas; i++)
{
nombreColumnas = cdr.getMetaData().getColumnName(i);
}
while(cdr.next())
{
fw.write(System.getProperty("line.separator"));
fw.write("<registro>");
fw.write(System.getProperty("line.separator"));
for (int i=0; i<numColumnas; i++)
{
fw.write(" <" + nombreColumnas + ">" + cdr.getString(i) + "</" + nombreColumnas + ">");
fw.write(System.getProperty("line.separator"));
}
fw.write("</registro>");
}
fw.close();
return cdr;
}

Ya se lo que ha pasado. El editor éste es un poco cacas, y no escapa el texto que metes. Te lo digo porque yo puse nombreColumnas - abro corchete - i - cierro corchete, ¿me entiendes? Al meterlo tal cual, el editor de texto entiende que quieres meter un formato italic (cursiva) . Cosas de estos editores modernos...
Bueno, el caso es que donde te encuentres "nombreColumnas", ponle detrás un abrir corchete "[" mas una "i", mas cerrar corchete "]", para que itere por los elementos del array
"Manda huevos..." Federico Trillo.
Bueno, el caso es que donde te encuentres "nombreColumnas", ponle detrás un abrir corchete "[" mas una "i", mas cerrar corchete "]", para que itere por los elementos del array
"Manda huevos..." Federico Trillo.

Ok gracias por el apunte, de todas formas ahora una vez solucionado eso, me marca como error todas la lineas donde aparece fw.write etc.. y si tengo import java.io.*; cual puede ser el problema... muchas gracias un saludo
public void generarxml(java.sql.ResultSet cdr) throws java.sql.SQLException
{
java.io.FileWriter fw= new java.io.FileWriter("c:/consulta.xml");
fw.write("<?xml version=\"1.0\" ?>");
int numColumnas = cdr.getMetaData().getColumnCount();
String[] nombreColumnas = new String[numColumnas];
for (int i=0; i<numColumnas; i++){
nombreColumnas = cdr.getMetaData().getColumnName(i);
}
while(cdr.next()){
fw.write(System.getProperty("line.separator"));
fw.write("<registro>");
fw.write(System.getProperty("line.separator"));
for (int i=0; i<numColumnas; i++){
fw.write(" <" + nombreColumnas + ">" + cdr.getString(i) + "</" + nombreColumnas + ">");
fw.write(System.getProperty("line.separator"));
}
fw.write("</registro>");
}
fw.close();
}
public void generarxml(java.sql.ResultSet cdr) throws java.sql.SQLException
{
java.io.FileWriter fw= new java.io.FileWriter("c:/consulta.xml");
fw.write("<?xml version=\"1.0\" ?>");
int numColumnas = cdr.getMetaData().getColumnCount();
String[] nombreColumnas = new String[numColumnas];
for (int i=0; i<numColumnas; i++){
nombreColumnas = cdr.getMetaData().getColumnName(i);
}
while(cdr.next()){
fw.write(System.getProperty("line.separator"));
fw.write("<registro>");
fw.write(System.getProperty("line.separator"));
for (int i=0; i<numColumnas; i++){
fw.write(" <" + nombreColumnas + ">" + cdr.getString(i) + "</" + nombreColumnas + ">");
fw.write(System.getProperty("line.separator"));
}
fw.write("</registro>");
}
fw.close();
}

Otra vez:
No te funciona porque no has sustituido en todo el código "nombreColumnas" por "nombreColumnas(i)", siendo los paréntesis en realidad corchetes.
No te funciona porque no has sustituido en todo el código "nombreColumnas" por "nombreColumnas(i)", siendo los paréntesis en realidad corchetes.

Hola, me paso igual que a ti antes "no me puso nombreColumnas " aquí, pero en el código que tengo yo si lo tiene en cada nombreColumnas por eso me extraña, yo pienso que es algo relacionado con la gestión del FileWriter, y lo estuve revisando y no le veo por donde puede cogear... muchas gracias un saludo

¿Aquí tienes creo que el fallo es por que deje sin cerrar algún corchete XDDD creo no se que opinas tu? Gracias un saludo
Compiling 2 source files to C:\Archivos de programa\Java\jdk1.5.0_09\ejemplos\VistaTabla\build\classes
C:\Archivos de programa\Java\jdk1.5.0_09\ejemplos\VistaTabla\src\CBaseDeDatos.java:75: 'class' or 'interface' expected
}
C:\Archivos de programa\Java\jdk1.5.0_09\ejemplos\VistaTabla\src\CBaseDeDatos.java:81: 'class' or 'interface' expected
2 errors
BUILD FAILED (total time: 0 seconds)
Compiling 2 source files to C:\Archivos de programa\Java\jdk1.5.0_09\ejemplos\VistaTabla\build\classes
C:\Archivos de programa\Java\jdk1.5.0_09\ejemplos\VistaTabla\src\CBaseDeDatos.java:75: 'class' or 'interface' expected
}
C:\Archivos de programa\Java\jdk1.5.0_09\ejemplos\VistaTabla\src\CBaseDeDatos.java:81: 'class' or 'interface' expected
2 errors
BUILD FAILED (total time: 0 seconds)

Con esta mierda de editor es imposible. Si no te importa me mandas el código a [email protected] y le echo un vistazo. Seguro que así lo solucionamos antes.

Ok, la verdad es que es un poco desesperante, ya te envíe la clase aver si tu lo ves mejor que yo no se por que no compila XDD gracias y un saludo

Ya está: el problema es que no capturas la excepción java. Io. IOException. Tendrás que poner un try-catch dentro del método obtenerTabla o bien preparar el método para que lance la excepción java. Io. IOException, además de la SQLException que ya lanzas.
Espero que con esto se quede finiquitado. Por cierto, ¿Qué entorno de desarrollo usas? Yo uso Eclipse y en seguida me dice que el fallo está en que no he capturado la excepción. Te recomiendo que uses un entorno de desarrollo del tipo Eclipse o NetBeans, que te facilitan mucho la vida.
Espero que con esto se quede finiquitado. Por cierto, ¿Qué entorno de desarrollo usas? Yo uso Eclipse y en seguida me dice que el fallo está en que no he capturado la excepción. Te recomiendo que uses un entorno de desarrollo del tipo Eclipse o NetBeans, que te facilitan mucho la vida.

Ok ya me compila¡, perdona hace poco que me metí con java, y tengo la duda, de porque hay que lanzarle las excepciones ¿? ¿? Obligatoriamente.
Trabajo con netbeans 5.0, ¿de eclipse he oído hablar también muy bien que tal se trabaja con el? Es más intuitivo que netbeans ¿? ¿
Muchas gracias por la ayuda prestada¡ Un saludo
Trabajo con netbeans 5.0, ¿de eclipse he oído hablar también muy bien que tal se trabaja con el? Es más intuitivo que netbeans ¿? ¿
Muchas gracias por la ayuda prestada¡ Un saludo

Pues las excepciones es conveniente capturarlas, y en el caso de que se produzcan, pues bien escribir una traza en un log (por ejemplo usando el api "log for Java", aquí "log4j"), o bien lanzar la excepción y en otra parte del programa, informar al usuario de que algo ha ido mal. Eso depende de ti (o de tu jefe ;-) ).
Un saludo. Y por favor, valora la respuesta para dejar la pregunta como cerrada.
Suerte y ánimo con Java ;-)
Carlos
Un saludo. Y por favor, valora la respuesta para dejar la pregunta como cerrada.
Suerte y ánimo con Java ;-)
Carlos
- Compartir respuesta
- Anónimo
ahora mismo
