Pasar fichero XML en Java

Drolan

Buenas a todos, estoy intentando aprender a manejar el tema de sockets en Java y ya he hecho el tipico chat y eso.

Tengo un proyectillo pensado y necesito pasar archivos XML entre cliente y servidor. He buscado por ahi y no encuentro nada. ¿Alguien que sepa algo del tema y pueda iluminarme?

Grazie!

bLero

Pues si lo que necesitas es ir enviar el propio fichero XML sin querer parsearlo (al vuelo) es bien sencillo:

En el lado del envío del fichero:

  • Usas un Stream para leer el archivo.
  • Para cada línea que vayas leyendo la envías por el socket hasta el final del archivo
  • Mandas una señal al socket destino para decir que puede cerrar la comunicación. (Por ejemplo la palabra "end_of_file").
  • Cierras ambos streams.

En el lado donde se recibe el fichero:

  • Usas un bucle contínuo que espera lineas de texto provenientes del socket hasta encontrar la palabra "end_of_file"
  • Para cada linea que llegue la vas escribiendo en un fichero nuevo.
  • Cuando llegue "end_of_file" cierras los 2 streams.

Hay otras formas de mandarlo, por ejemplo usando el protocolo HTTP, o un stream binario, pero si estás aprendiendo eso es lo que se usa.

Si lo que buscas es ir parseándolo al vuelo, aquí tienes la solución:

http://stackoverflow.com/questions/7373567/java-how-to-read-and-write-xml-files

1 respuesta
Drolan

Si, eso lo habia pensado pero quizá habia otra forma. Tiraré por ahí pues.

Muchas gracias.

1 respuesta
tersark

#3

En java si quieres tienes los object streams que te permiten pasar por un socket objetos serializables

http://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html
http://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html

Lo malo es lo de la serialización que es un poco coñazo, para lo demás es muy comodo poder pasar objetos directamente.

1 respuesta
Drolan

#4 Muchas gracias, tiene buena pinta pero no tengo nidea de serializar! Miraré a ver como va eso.

1 respuesta
tersark

#5 basicamente las clases tienen que extender serializable y que todos sus elementos sean serializables.

En el caso de que algun elemento no lo sea, lo puedes declarar como transient. Pero los elementos que estan definidos como transient no seran transmitidos.

La verdad es depende de que quieras hacer puede resultar muy practico o un completo coñazo XDD pero vamos, nunca está de más saberlo!

1 respuesta
17 días después
pdj

#6 no lo lies con anotaciones :)

Luego si quieres pasarlo por socket haría caso a #2, es un poco "rudimentario" pero va bien y sino lo haria por HTTP, tienes una implementación de JAVAX (Jersey) que te hace la magia de enviar una clase en formato XML, JSON etc. Si quieres ejemplos sobre esto tengo varios

Drolan

Muchas gracias a todos de nuevo, al final hice un "mix" de entre todas las soluciones. Lo explico por si a alguien le sirve:

Me he creado una clase serializable cuyo contenido es un ArrayList. EL ArrayList contendrá cada una de las lineas del XML.

El servidor instancia la clase metiendo en el ArrayList todas las lineas del XML

Envio la clase con un ObjectOutputStream, queda algo asi:

spoiler

El cliente generará un nuevo XML y lo contruirá a partir de cada elemento del ArrayList

Usuarios habituales

  • Drolan
  • pdj
  • tersark
  • bLero