problema al leer fichero con DOM

87 views
Skip to first unread message

Rocio Saiz

unread,
Nov 12, 2011, 5:06:06 AM11/12/11
to desarrolladores-android
Hola a todos, os comento tengo una clase que lee un fichero xml desde
la sd card. Para leerlo empleo Dom os pongo el codigo:
package mi.proyecto;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

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

import android.util.Log;


public class RssParserDom
{
public RssParserDom()
{}
public List<Pregunta> parse()
{
InputStream obj_is = null;
Document dom = null;
DocumentBuilderFactory factory=null;
DocumentBuilder db=null;
List<Pregunta> preguntas = new ArrayList<Pregunta>();
try
{
obj_is = new FileInputStream("/sdcard/fichero.xml");

//Instanciamos la fábrica para DOM
factory = DocumentBuilderFactory.newInstance();

//Creamos un nuevo parser DOM
db = factory.newDocumentBuilder();

dom = db.parse(obj_is);

//Nos posicionamos en el nodo principal del árbol (<quiz>)
Element root = dom.getDocumentElement();

//Localizamos todos los elementos <question type>
NodeList questiontype =
root.getElementsByTagName("question type");

//Recorremos la lista de preguntas
for (int i=1; i<questiontype.getLength(); i++)
{
Pregunta pregunta = new Pregunta();

//Obtenemos la pregunta actual
Node item = questiontype.item(i);

//Obtenemos la lista de datos de la pregunta actual
NodeList datosPregunta = item.getChildNodes();

//Procesamos cada dato de la pregunta
for (int j=0; j<datosPregunta.getLength(); j++)
{
Node dato = datosPregunta.item(j);
String etiqueta = dato.getNodeName();

if (etiqueta.equals("questiontext format"))
{

pregunta.setContenido(dato.getFirstChild().getNodeValue());
}
else if (etiqueta.equals("answer fraction"))
{
String texto = obtenerTexto(dato);
pregunta.setPuntuacionTrue(texto);
}
else if (etiqueta.equals("answer fraction"))
{
String texto = obtenerTexto(dato);
pregunta.setPuntuacionFalse(texto);
}
}

preguntas.add(pregunta);
}
}
catch (Exception ex)
{
Log.e("Ficheros", "Error al intentar leer el xml");
//throw new RuntimeException(ex);
}

return preguntas;
}

private String obtenerTexto(Node dato)
{
StringBuilder texto = new StringBuilder();
NodeList fragmentos = dato.getChildNodes();

for (int k=0;k<fragmentos.getLength();k++)
{
texto.append(fragmentos.item(k).getNodeValue());
}

return texto.toString();
}

}

desde la clase principal lo llamo, pero me salta la excepción error en
el for y no se que puede pasar


package mi.proyecto;

import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;


public class AndroQuestionnaireActivity extends Activity
{
public static String pregun1="";
public static String pregun2="";
public static String pregun3="";
public static String pregun4="";
public static String pregun5="";
public static int veces=1;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
List<Pregunta> preguntas= new ArrayList<Pregunta>();
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try{
RssParserDom domparser=new RssParserDom();
preguntas = domparser.parse();
try
{
for(int i=0;i<=preguntas.size(); i++)
{
if (i==0)
pregun1=preguntas.get(i).getContenido();
else if(i==1)
pregun2=preguntas.get(i).getContenido();
else if (i==2)
pregun3=preguntas.get(i).getContenido();
else if( i==3)
pregun4=preguntas.get(i).getContenido();
else
pregun5=preguntas.get(i).getContenido();
}
}
catch (Exception e)
{
Log.e("error", "Error en el for");
}
}
catch (Exception e)
{
Log.e("error", "error al llamar a los constructores");
}

Button next = (Button) findViewById(R.id.button1);
next.setOnClickListener(new View.OnClickListener()
{
public void onClick(View view)
{
Intent myIntent = new
Intent(AndroQuestionnaireActivity.this, primerapregunta.class);
startActivity(myIntent);
}
});
}
}
Alguien me puede ayudar??? Por favor!

Javier Hernández

unread,
Nov 12, 2011, 7:08:54 AM11/12/11
to desarrolladores-android
¿Por qué usas el DOM y no usas SAX?

http://es.wikipedia.org/wiki/Document_Object_Model

http://en.wikipedia.org/wiki/Simple_API_for_XML

Saludos

PD: cuando se ayuda/comparte algo desinteresadamente, creo, que lo
mínimo que se puede dar son las 'gracias', (algo que me parece de
educación básica), [pura_vida].

Julián Marqués

unread,
Nov 12, 2011, 7:36:56 AM11/12/11
to desarrollad...@googlegroups.com
Hola Rocío,

disculpa si me equivoco, pero ese código lo has escrito tu desde cero o hiciste un copy&paste y modificaste?. Disculpa si no es así, pero creo que has modificado sobre el código de ejemplo del blog de sgoliver(justo hace unos dias me estudie ese post pq necesito leer xml y es un fantástico trabajo el de este hombre), si es así te aconsejo que entiendas primero como funciona y luego lo apliques a tu programa, no sólo porque no "copies" sino pq ese ejemplo está enfocado a leer desde internet un Rss y no desde la tarjeta de memoria y hay cosas que tienes que modificar. Si no me estoy equivocando te aconsejo que leas desde la primera entrada en la que habla de leer XML y te decidas por SAX o DOM según lo que te interese más como dice Javier.


Disculpa si me equivoco, pero es que me sonaron mucho los cometarios del código y la estructura pq lo tengo muy reciente :/

un saludo.


--
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a desarrolladores-a...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/desarrolladores-android?hl=es.




--
Julián Fco Marqués García.

Rocio Saiz Oviedo

unread,
Nov 12, 2011, 8:29:20 AM11/12/11
to desarrollad...@googlegroups.com
Si que tienes razón que el código lo saque de donde tu dices.
Ya he solucionado el problema, era con la estructura del xml que le pasaba, no me recogia ningún dato del fichero, pero ya esta arreglado. 
De todas formas muchísimas gracias a todos!!

Javier Hernández

unread,
Nov 12, 2011, 8:48:43 AM11/12/11
to desarrolladores-android
¿A qué se refiere con esto?

(Security note...the "entity resolver" bit is CRITICAL to avoid a
giant security hole in the DOM API).

>> http://androidforums.com/application-development/34284-how-read-xml-file-sdcard-parse.html

¿cuáles son los bugs?

Saludos
Reply all
Reply to author
Forward
0 new messages