Cómo relleno un objeto de JAVA parseando un XML ?

epalace
23 de Marzo del 2005
Hola a todos,

Mi problema es el siguiente: Tengo un archivo XML que me han dado , y debo volcar la información a un objeto JAVA con la misma estructura.

He estado intentandolo hacer con los manejadores de SAX, pero encuentro que es complicado debido a que existen métodos diferentes para entrar y salir de un elemento (startElement y endElement) y para recuperar la información (characters).

Para saber en qué lugar del arbol estoy, he probado a activar y desactivar flags , y luego comprobarlos en el metodo "characters" para saber donde meter la información, pero encuentro que es una guarrada.

¿Existe una forma más sencilla y elegante de hacerlo? Me imagino que sí.

Gracias,

epalace

legolas
23 de Marzo del 2005
package practicaSMS.gestionConcursos.xmlDOM;

import java.util.StringTokenizer;
import java.util.Vector;


public class ConcursoXML {

private int codigo;
private String acronimo;
private String descripcion;
private Vector opciones;
private Vector palabras;

public ConcursoXML(int codigo,String acronimo,String descripcion)
{

this.codigo = codigo ;
this.acronimo= acronimo;
this.descripcion = descripcion;
this.opciones = null;
this.palabras = null;

}

//constructor
public ConcursoXML(int codigo, String acronimo ,String descripcion, String opc ,String pal){
this.codigo = codigo ;
this.acronimo= acronimo;
this.descripcion = descripcion;
this.opciones = this.separarPalabras(opc);
this.palabras = this.separarPalabras(pal);
}

/**
* @return
*/
public String getAcronimo() {
return acronimo;
}

/**
* @return
*/
public int getCodigo() {
return codigo;
}

/**
* @return
*/
public String getDescripcion() {
return descripcion;
}

/**
* @return
*/
public Vector getOpciones() {
return opciones;
}

/**
* @return
*/
public Vector getPalabras() {
return palabras;
}

/**
* @param i
*/
public void setAcronimo(String i) {
acronimo = i;
}

/**
* @param i
*/
public void setCodigo(int i) {
codigo = i;
}

/**
* @param i
*/
public void setDescripcion(String i) {
descripcion = i;
}

/**
* @param vector
*/
public void setOpciones(Vector vector) {
opciones = vector;
}

/**
* @param vector
*/
public void setPalabras(Vector vector) {
palabras = vector;
}

private Vector separarPalabras(String frase){
Vector v = new Vector();
StringTokenizer st = new StringTokenizer(frase, ",");
while (st.hasMoreTokens()){
String s = st.nextToken().trim();
v.add(s);
}
return v;
}

public boolean validarOpciones(Vector v,String texto)
{
for(int i=0;i<v.size();i++){
String word = (String)v.elementAt(i);
if (texto.indexOf(word) != -1){
return true;
}
}
return false;

}

}

Legolas
23 de Marzo del 2005
/*
* GestorConcursosXML.java
*
* Created on 12 de agosto de 2004, 20:54
*/

package practicaSMS.gestionConcursos.dao;

import java.io.*;
import java.io.OutputStream;
import java.util.Vector;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.*;

import practicaSMS.gestionConcursos.Concurso;
import practicaSMS.gestionConcursos.RestriccionOpcionesPermitidas;
import practicaSMS.gestionConcursos.RestriccionPalabrasNoPermitidas;
import practicaSMS.gestionConcursos.xmlDOM.ConcursoXML;

public class GestorConcursosXML implements IGestorDatosConcursos{

private Document doc;

/** Creates a new instance of GestorConcursosBD */
public GestorConcursosXML() {

}

/**
* Carga el documento XML.
*/
public void conectarOrigenDatos() throws DAOException {
DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
try{
DocumentBuilder builder = fact.newDocumentBuilder();
doc = builder.parse((new File("C:\\Alumno\\eclipse\\eclipse\\workspace\\proyectoISO3\\src\\practicaSMS\\gestionConcursos\\xmlDOM\\concursosXML.xml")).toString());

}catch(Exception e){e.printStackTrace();}
}

/**
* Guarda el documento XML.
*/
public void desconectarOrigenDatos() throws DAOException {

}

/**
* Devuelve los concursos almacenados en el fichero XML.
* @return Vector de Concursos que contiene los concursos almacenados en el fichero XML.
*/
public java.util.Vector obtenerConcursos() throws DAOException {
String opciones;
String palabras;
conectarOrigenDatos();
Vector concursos = new Vector();
if(concursos == null)
concursos = new Vector();

NodeList nodoConc = doc.getElementsByTagName("Concurso");
int numConc = nodoConc.getLength();
for(int i = 0;i <numConc;i++)
{
palabras="";
opciones="";
Node concurso =nodoConc.item(i);
NamedNodeMap cValores = concurso.getAttributes();
int codigo = Integer.parseInt(cValores.getNamedItem("codigo").getNodeValue());
String acronimo = cValores.getNamedItem("acr").getNodeValue();
String descripcion = cValores.getNamedItem("descripcion").getNodeValue();
if(!cValores.getNamedItem("palabras").getNodeValue().equals("")){
palabras = cValores.getNamedItem("palabras").getNodeValue();

}
if(!cValores.getNamedItem("opciones").getNodeValue().equals("")){
opciones = cValores.getNamedItem("opciones").getNodeValue();

}
concursos.add(new ConcursoXML(codigo,acronimo,descripcion,opciones,palabras));
}
return concursos;
}

/**
* Inserta un nuevo concurso. Devuleve un objeto Concursocon los datos del mismo.
* @param acronimo del concurso.
* @param descripcion Nombre del concurso.
* @return Concurso con el acronimo y el nombre del concurso dado de alta.
*/
public Concurso insertarConcurso(String acronimo, String descripcion) throws DAOException
{
Concurso c = null;
conectarOrigenDatos();
Node r = doc.getDocumentElement();
NodeList nodoConc = doc.getElementsByTagName("Concurso");
Element nodo = doc.createElement(("Concurso"));
String codigo = String.valueOf(nodoConc.getLength()+1).toString();
doc.createAttribute("codigo").setNodeValue(codigo);
doc.createAttribute("acronimo").setNodeValue(acronimo);
doc.createAttribute("descripcion").setNodeValue(descripcion);
nodo.insertBefore(doc,r.getLastChild());

c.setAcronimo(acronimo);
c.setDescripcion(descripcion);


return c;
}

/**
* Inserta restricciones del tipo palabras no permitidas.
* @param np Restrición que contiene un vector con las palabras no permitidas
* y el concurso al que pertenecen las restriciones.
*/
public void insertarNoPermitidas(RestriccionPalabrasNoPermitidas np) throws DAOException {

}

/**
* Inserta restricciones del tipo opciones.
* @param op Restrición que contiene un vector con las opciones permitidas
* y el concurso al que pertenecen las restriciones.
*/
public void insertarOpciones(RestriccionOpcionesPermitidas op) throws DAOException {

}

public void cargarXML(Vector v) {
try{

OutputStream fout= new FileOutputStream("C:\\Alumno\\eclipse\\eclipse\\workspace\\proyectoISO3\\src\\practicaSMS\\gestionConcursos\\xmlDOM\\concursosXML.xml");
OutputStream bout= new BufferedOutputStream(fout);
OutputStreamWriter out = new OutputStreamWriter(bout, "8859_1");
if(v.elementAt(0).equals("XML")){
out.write("<?xml version=\"1.0\" ");
out.write("encoding=\"ISO-8859-1\"?>\r\n");
out.write("<Concursos>\r\n");
for(int i = 1 ; i<v.size();i++)
{
ConcursoXML cx = (ConcursoXML)v.elementAt(i);
out.write(" <Concurso codigo=\'"+cx.getCodigo()+"\' " );
out.write(" acr =\'"+cx.getAcronimo()+"\' ");
out.write(" descripcion =\'"+cx.getDescripcion()+"\'\r\n");
out.write(" opciones=\'");
if(cx.getOpciones() != null){
if(cx.getOpciones().size() == 0)out.write("\'");
else{
for(int j = 0;j<cx.getOpciones().size()-1;j++)
out.write(cx.getOpciones().elementAt(j)+",");
out.write(cx.getOpciones().elementAt(cx.getOpciones().size()-1)+"\'");
}
}else out.write("\'");
out.write(" palabras=\'");
if(cx.getPalabras() != null){
if(cx.getPalabras().size() == 0) out.write("\'");
else{
for(int j = 0;j<cx.getPalabras().size()-1;j++)
out.write(cx.getPalabras().elementAt(j)+",");
out.write(cx.getPalabras().elementAt(cx.getPalabras().size()-1)+"\'");
}
}else out.write("\'");
out.write( "/>\r\n");
out.flush();
}

}
else {
out.write("<?xml version=\"1.0\" ");
out.write("encoding=\"ISO-8859-1\"?>\r\n");
out.write("<Concursos>\r\n");
for(int i = 0 ; i<v.size();i++){
Concurso cx = (Concurso)v.elementAt(i);
out.write(" <Concurso codigo=\'"+cx.getId()+"\' " );
out.write(" acr =\'"+cx.getAcronimo()+"\' ");
out.write(" descripcion =\'"+cx.getDescripcion()+"\'\r\n");
if(cx.obtenerRestricciones().size() < 1){
out.write(" opciones=\'\'");
out.write(" palabras=\'\'");
}
else
if(cx.obtenerRestricciones() != null){
boolean pasoOpc = false;
boolean pasoPal = false;
System.out.println(cx.obtenerRestricciones().size() + " "+cx.getAcronimo());
Vector v2 = cx.obtenerRestricciones();
for (int j = 0 ;j<v2.size();j++){
if(v2.elementAt(j) instanceof RestriccionOpcionesPermitidas)
{
out.write(" opciones=\'");
Vector restric2 = ((RestriccionOpcionesPermitidas)v2.elementAt(j)).getOpcionesPermitidas();
if(restric2.size() == 0){out.write("\'");}
else {
for (int z = 0; z<restric2.size()-1;z++){
out.write(restric2.elementAt(z)+",");
}
pasoOpc = true;
out.write(restric2.elementAt(restric2.size()-1)+"\'");
}
}
else{
Vector restric2 = ((RestriccionPalabrasNoPermitidas)v2.elementAt(j)).getPalabrasNoPermitidas();
out.write(" palabras=\'");
if(restric2.size() == 0){out.write("\'");}
else {
for (int z = 0; z<restric2.size()-1;z++){
out.write(restric2.elementAt(z)+",");
}
pasoPal = true;
out.write(restric2.elementAt(restric2.size()-1)+"\'");
}
}
}
if(pasoOpc ==false){out.write(" opciones=\'\'");}
if(pasoPal ==false){out.write(" palabras=\'\'");}
}
out.write( "/>\r\n");
out.flush();
}

}
out.write("</Concursos>\r\n");
out.flush();
out.close();
}catch(IOException e) {
System.out.println(e.getMessage());
}

}

}


nicokiki
23 de Marzo del 2005
Hola!!!!!!!!

Disculpen q me meta, pero el metodo " public void cargarXML(Vector v)" es no recomendable. Con esto no quiero decir nada, solo sigo q generar un XML "a mano" de esa manera no es logico sabiendo q existen parsers para eso. Reitero q no quiero agredir a nadie con esto, es solo una opinion. No tengo dudas de q debe funcionar pero no es una buena practica hacer algo asi ya q ante un cambio de la estructura del XML te cambia todo pero todo el metodo.

Salu2!!!!!!!!!!