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


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.
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.
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
parece ser que las bibliotecas no están agregadas al classpath, asegúrate que los jar están en web-inf/lib
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
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!!
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
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!
gracias por compartir tus codigos, me han servido de mucho… de verdad muchas gracias!!!
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.