18
May
10

Leyendo, Editando y Guardando archivos XML desde JSP; DOM+SAX=JDOM

En algunas ocasiones se hará necesario leer archivos XML de JAVA o JSP, en este caso, veremos la lectura, escritura y guardado de archivos XML con JDOM en JSP, aunque la forma funcional es igual a JAVA.

Que es XML, xml es un “lenguaje” mmm no, no es un lenguaje es un “metalenguaje”, que se utiliza para almacenar información dentro de etiquetas muy parecido a html, pero en este no hay etiquetas predefinidas eres tu quien define que etiquetas hay y cuál es el orden.

Cada etiqueta es un nodo y dentro de este nodo puede haber o no otros nodos, entonces xml se convierte en un árbol de nodos, y por estándar tiene un nodo raíz o nodo padre.

Ejemplo documento xml

<?xml version="1.0" encoding="ISO-8859-1" ?>
<nodo_raiz>
	<nodo_nivel1>
		<nodo_nivel2>
		</nodo_nivel2>
	</nodo_nivel1>
	<nodo_nivel1>
	</nodo_nivel1>
</nodo_raiz>
<?xml version="1.0" encoding="ISO-8859-1" ?>
<nodo_raiz atributo1="valor">
	<nodo_nivel1 atributo1="valor">
		<nodo_nivel2>
		</nodo_nivel2>
	</nodo_nivel1>
	<nodo_nivel1  atributo1="valor"/>
	</nodo_raiz>

Bueno que es JDOM, JDOM es una API de java para leer archivos XML, en java existen varias y cada quien puede hacer su propia librería, pero lo especial de esta es que utilizan las 2 librerías mas potentes y la combinan en una sola SAX+DOM=JDOM.

la estructura de la aplicación sería algo como

Hablando ya de la aplicación está dividida en 3 partes:

  • Agregar un nodo al documento XML
  • Recorrer la lista de nodos en un documento y mostrar los datos
  • Copiar un documentó XML

En la index.jsp cargamos el documento xml, guardamos las variables necesarias en la sesión e incluimos las demás paginas

index.jsp

<%@page import="java.util.List" %>

<%@page import="org.jdom.Document"%>
<%@page import="org.jdom.Element"%>

<%@page import="org.jdom.input.SAXBuilder" %>

<%
	/*SAXBuilder se encarga de cargar el archivo XML del disco o de un String */
	SAXBuilder builder=new SAXBuilder();
	/*direccion del archivo XML*/
	String xml_path="C:/Archivos de programa/Apache Software Foundation/Apache Tomcat 6.0.24(stand)/webapps/ejercicio14/departamentos.xml";
	/*Cargamos el documento*/
    Document bd_xml=builder.build(xml_path);
	/*Sacamos el elemento raiz*/
    Element raiz=bd_xml.getRootElement();

	/*Guardamos la direccion al archivo, el archivo, y la lista de nodos departamento */
	session.setAttribute("xml_path",xml_path);
	session.setAttribute("bd_xml",bd_xml);
	session.setAttribute("lista_departamento",raiz.getChildren("departamento"));

	/*traemos el nombre de la copia*/
	String copia=(String)session.getAttribute("copia");
%>
<html>
<head>
<title>JDOM</title>
<style>
*{
	background-color:#CC0000;
	color:#FFFFFF;
}
</style>
</head>
<body>

<table width="100%" border="0" cellspacing="0" cellpadding="5">
  	<tr>
    	<td valign="top">
			<jsp:include page="registro_departamento.jsp"/>
			<br>
			<jsp:include page="copia_bd_xml.jsp"/>
			<br>
			<!--si la copia es diferente de null mostramos el enlace -->
			<%if(copia!=null){%>
				<a href="<%=copia%>"> Descarga Copia de la BD</a>
			<%}%>
		</td>
    	<td>
			<div style="height:650px; overflow:scroll;">
				<jsp:include page="listar_departamento.jsp"/>
			</div>
		</td>
  	</tr>
	<tr>
    	<td align="center" valign="top" colspan="2">

		</td>
  	</tr>
</table>

	</body>
</html>

Registro de departamento un formulario sencillo donde pedimos el nombre y la descripción de un departamento a registrar.

registro_departamento.jsp

<form action="proceso_registro_departamento.jsp" method="post" enctype="application/x-www-form-urlencoded">
	<table id="registro" width="110" border="0" cellspacing="0" cellpadding="5">
		<tr align="center">
			<td colspan="2" align="center">DATOS DEPARTAMENTO</td>
		</tr>
		<tr>
			<td>NOMBRE</td>
			<td><input name="nombre" type="text"> </td>
		</tr>
		<tr>
			<td>DESCRIPCION</td>
			<td><textarea name="descripcion" cols="20" rows="5"></textarea></td>
		</tr>
  		<tr align="center">
    		<td colspan="2" align="center"><input type="submit" value="Guargar"></td>
  		</tr>
	</table>
</form>

Copia de la bd xml, un formulario donde se pide el nombre que tendrá la copia del archivo xml.
copia_bd_xml.jsp

<form action="proceso_copia_bd_xml.jsp" method="post" enctype="application/x-www-form-urlencoded">
	<table id="registro" width="110" border="0" cellspacing="0" cellpadding="5">
		<tr align="center">
			<td colspan="2" align="center">COPIAR BASE DE DATOS </td>
		</tr>
		<tr>
			<td>NOMBRE</td>
			<td><input name="nombre" type="text"> </td>
		</tr>
  		<tr align="center">
    		<td colspan="2" align="center"><input type="submit" value="Guargar"></td>
  		</tr>
	</table>
</form>

Listar departamento, recoge la lista de nodos guardada en la sesión, la recorremos y vamos mostrando en la pagina

listar_departamento.jsp

<%@page import="java.util.List" %>
<%@page import="org.jdom.Element"%>

<%
		/*rescatamos la lista de la session*/
		/*la lista es una lista de Elements*/
		List lista_departamento=(List)session.getAttribute("lista_departamento");

		/*declaramos los nodos (recordamos que todo es un nodo)*/
		Element departamento=null;
		Element id=null;
		Element nombre=null;
		Element descripcion=null;
	 %>
		<table border="1" cellspacing="0" cellpadding="5">
			<tr><td colspan="3" align="center" >LISTA DE DEPARTAMENTOS </td></tr>
			<tr><td calign="center" >ID</td><td calign="center" >NOMBRE</td><td calign="center" >DESCRIPCION</td></tr>
  				<%
				  /*recorremos la lista*/
				  for(int i=0;i<lista_departamento.size();i++){
				    /*vamos sacando los elementos de esta*/
					departamento=(Element)lista_departamento.get(i);
					/*y de cada elemento (departamento) de la lista sacamos los 3 campos*/
					id=departamento.getChild("id");
					nombre=departamento.getChild("nombre");
					descripcion=departamento.getChild("descripcion");
					/*lo imprimimos en la pagina*/
					out.print("<tr>");
					out.print("<td>"+id.getText()+"</td>");
					out.print("<td>"+nombre.getText()+"</td>");
					out.print("<td>"+descripcion.getText()+"</td>");
					out.print("</tr>");
				}%>
		</table>
	</body>
</html>

Proceso registro departamento utilizamos varios parámetros parra llevar a cabo esta operación, ya que una imagen vale mal que mil palabras aquí está el código.

proceso_registro_departamento.jsp

<%@page import="java.io.FileOutputStream" %>
<%@page import="java.util.List" %>

<%@page import="org.jdom.Document"%>
<%@page import="org.jdom.Element"%>

<%@page import="org.jdom.output.XMLOutputter" %>

<%
	/*rescatamos el documento xml de la session*/
	Document bd_xml=(Document)session.getAttribute("bd_xml");
	/*sacamos el nodo raiz*/
    Element raiz=bd_xml.getRootElement();

	/*declaramos los nodos para crear un nuevo departamento*/
	Element departamento = new Element("departamento");
	Element id= new Element("id");
	Element nombre= new Element("nombre");
	Element descripcion=new Element("descripcion");

	/*seteamos los text del nuevo departamento*/
	int n_id=((List)session.getAttribute("lista_departamento")).size()+1;
	id.setText(""+n_id);
	nombre.setText(request.getParameter("nombre") );
	descripcion.setText(request.getParameter("descripcion") );
	/*agregamos los elementos a un nodo*/
	departamento.addContent(id);
	departamento.addContent(nombre);
	departamento.addContent(descripcion);
	/*agregamos el nodo al nodo raiz*/
	raiz.addContent(departamento);

	/*guardamos los cambios*/
	XMLOutputter xml_out=new XMLOutputter();
    FileOutputStream file_os=new FileOutputStream(""+session.getAttribute("xml_path") );
    xml_out.output(bd_xml,file_os);
	file_os.close();

%>
<jsp:forward page="index.jsp"/>

Proceso copia BD, es algo realmente sencillo crear un documento xml (en base a otro)

proceso_copia_bd_xml.jsp

<!--Flujo de salida -->
<%@page import="java.io.FileOutputStream" %>
<%@page import="java.util.Date" %>

<!--Representa un documento -->
<%@page import="org.jdom.Document"%>
<!--Representa un nodo -->
<%@page import="org.jdom.Element"%>
<!--Clase que se encarga de escribir el xml en el disco duro -->
<%@page import="org.jdom.output.XMLOutputter" %>

<%

	/*sacamos el documento de la session*/
	Document bd_xml=(Document)session.getAttribute("bd_xml");
	/*sacamos el nodo prncipal del documento*/
    Element raiz=bd_xml.getRootElement();

	/*parametro  para agregar a un nodo*/
	String descripcion="copia de la base de datos original";
	/*nombre del archivo*/
	String nombre=request.getParameter("nombre");
	nombre=nombre+".xml";

	/*agregando parametros al nodo raiz*/
	raiz.setAttribute("desc",descripcion);
	raiz.setAttribute("fecha",new Date().toString() );

	/*actualizando el nodo raiz*/
	bd_xml.removeContent();
	bd_xml.addContent(raiz);

	/*nueva direccion para el */
	String nueva_dir="C:/Archivos de programa/Apache Software Foundation/Apache Tomcat 6.0.24(stand)/webapps/ejercicio14/"+nombre;
	FileOutputStream file_os=new FileOutputStream(nueva_dir);

	XMLOutputter xml_out=new XMLOutputter();
	/*escribimos el documento en el disco duro*/
    xml_out.output(bd_xml,file_os);
	/*cerramos el stream*/
	file_os.close();
	/*guardamos el nombre del nuevo documento en la session*/
	session.setAttribute("copia",nombre);

%>
<!--transferencia de control a la pagina index -->
<jsp:forward page="index.jsp"/>

Utilizamos una base para el xml

departamentos.xml

<?xml version="1.0" encoding="UTF-8"?>
<departamentos desc=" base de datos original">
</departamentos>

recursos usados
JDOM


16 Responses to “Leyendo, Editando y Guardando archivos XML desde JSP; DOM+SAX=JDOM”


  1. 1 Ivan
    agosto 25, 2010 a las 12:37 pm

    Hola, me gusto y me sirvio mucho

    amigo tengo una duda no se si me podrias colaborar con un manual o una explicacion.

    mira tengo ya mi web jsp, me corre bien en mi ekipo local con tomcat 6, resulta k kiero pulicarla y k salga a internet, pero no tengo idea ya k esta debe corren en el tomcat, no se si en internet hay dominios gratis con servidores tomcat o si se puede hacer desde mi makina local.

    en todo caso agradeceria cualquier ayuda

    mi correo es: opusdopus13@yahoo.es

    Ivan.

    • agosto 25, 2010 a las 3:15 pm

      bueno una de las diferencias no técnicas mas notables entre PHP y JSP es el precio, por su puesto que hay servidores. te toca la buscada la diferencia en el precio con uno PHP como poco serán unos 100 US, pero lo puedes poner desde tu propio PC.

  2. 3 RUbén
    agosto 28, 2011 a las 1:54 pm

    Hola muy buenas, me he bajado un par de ejemplos tuyos para practicar en mi Eclipse,, y algo debo de tener mal en mi máquina porque me sale :
    Ha tenido lugar un error en la línea: 7 en el fichero java generado
    Only a type can be imported. org.jdom.Document resolves to a package

    Podrías decirme porqué parace que no vé las clases??EN las páginas no me sale ningún error , sólo al cargala…

    Muchas gracias por todo un saludo

    • agosto 29, 2011 a las 6:17 pm

      parece ser que las bibliotecas no están agregadas al classpath, asegúrate que los jar están en web-inf/lib

  3. 5 roberto
    abril 4, 2012 a las 3:21 am

    hola, el ejemplo esta genial, ahora lo que estoy intentado añadir es nuevos nodos al xml, y borrar los departamentos, si pudierais ayudarme.
    gracias

  4. 6 Ale
    abril 17, 2012 a las 2:40 pm

    Hola! Necesito ayuda urgente, he creado una clase que genera un xml desde una tabla de My sql sin problema alguno. Pero al momento de hacer la lectura del mismo xml me da error de espacio en memoria, debido que el archivo contiene mas de 20.000 registros, especificamente en la linea donde se instancia el new Document, si alguien tiene alguna info de como podria leer mi xml de gran tamaño sin problemas se lo agradeceria!! 🙂

    • abril 17, 2012 a las 4:37 pm

      las respuestas tal vez no te satisfagan pero bueno una vez se me presento un caso igual y mi decisión fue (1)cambiar de tecnología por json, lo otro que puedes hacer es (2)crear un xml que contenga estrictamente lo que requieres, (3) dividir el xml en varios, (4) crear una clase donde extraigas la info con la que vas a trabajar y dejarlo interno al software ir leyendo linea a linea o bloque a bloque el xml, (5) aumentar el tamaño de la pila de memoria (heap memory), (6) prueba con JDOM 2.0

      cual es el tamaño del documento xml?

      no se me ocurre ninguna otra, por el momento

      • 8 Ale
        mayo 8, 2012 a las 2:56 pm

        Hola! Justo me ocurre lo mismo, yo estoy programando en Java pero empleo Jdom de igual forma.
        De que manera puedo dividir en XML en varios?? eso me llamó la atención.

        Gracias, y buen aporte!

  5. 9 Joseph Tello
    mayo 6, 2012 a las 11:27 pm

    gracias por compartir tus codigos, me han servido de mucho… de verdad muchas gracias!!!

  6. mayo 22, 2012 a las 4:56 pm

    Buen dia, disculpe la molestia pero le comento, soy un tanto principiante y tengo un proyecto de la Universidad acerca del Manejo de XML con JSP, estuve leyendo su articulo de “leyendo, editando y guardando archivos xml desde jsp; dom+sax=jdom”, y me gustaria verlo funcionando, descargue el archivo que dice “Ejercicio 14” y la Libreria del JDom pero no lo lee ni netbeans ni eclipse, (Obviamente no se porque razón sucede esto, =( soy demasiado noob) solo me aparece las carpetas y ps la verdad no me funciona.. me gustaria saber si me puede enviar el proyecto listo para ser leído en netbeans, muchas gracias se lo agradezco muchisimo.

    • julio 30, 2013 a las 9:36 am

      Es un poco (muy) tarde pero el detalles es que estos proyectos no son para ser ejecutados en NetBeans ni Eclipse, estos proyectos son para ejecutar directamente sobre tu Tomcat; para hacerlo correr desde un IDE (Netbeans, Eclipse, JBuilder…) debes crear un proyecto nuevo y copiar y pegar los archivos sobre tu proyecto

  7. 12 CarlosG
    julio 25, 2013 a las 12:22 pm

    buenas tardes resulta que tengo un archivo jsp que tengo que enviarle un parametro a un server y este me carga un archivo xml que me genera un archivo pdf eso me lo hace yo dandole el codigo a la consulta pero si lo dígito desde el aplicativo no me carga, uso “String parametro1= request.getParameter(“codigodoc”);” esto en el server , sera que me puede colaborar para ver si es que me faltaria colocarle algo en el codigo xml para que me resiva ese parámetro. le agradezco su ayuda.

    • julio 30, 2013 a las 9:40 am

      Parece todo estar bien, te recomiendo que verifiques que valor tiene “codigodoc”, (me ha pasado) que trato de llamar una variable o parámetro que antes especifiqué con otro nombre.

  8. 14 Mariano
    abril 8, 2014 a las 6:10 am

    Buenas, tengo una consulta… tengo un proyecto en donde tengo que tomar un archivo xml y exponerlo en un Formulario en jsp… estuve leyendo mas de 3mil foros y no veo como hacerlo, algunos dicen que con Java Script, ahora bien.

    Tengo ya armado un archivo .java que me genera el xml, como puedo hacer que la informacion que tengo en el archivo .xml me aparezca en un formulario.jsp?

    Desde ya muchas gracias!!!!

    • abril 8, 2014 a las 7:16 am

      Bueno, creo que lo que tienes que hacer es posible hacerlo con lo que se encuentra en el blog, revisate las entradas. (muchos enlaces a los código están rotos pero en la parte de la derecha está la dirección del disco duro en drive y ahí están todos los códigos)


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


I+Ds

Dudas consultas
Facebook
Twiter
Google +

Escribe tu dirección de correo electrónico para suscribirte a este blog, y recibir notificaciones de nuevas publicaciones por correo.

Únete a otros 348 seguidores

Ingenio DS en Facebook

Redes Sociales y Archivos

Entradas

mayo 2010
L M X J V S D
« Abr   Jun »
 12
3456789
10111213141516
17181920212223
24252627282930
31  

IngenioDS en twiter


A %d blogueros les gusta esto: