Android - Problema con XML DOM

   
Vista:

Problema con XML DOM

Publicado por Francisco (1 intervención) el 07/05/2013 17:46:49
Hola.

Estoy haciendo una práctica con Android.
Ahora con tema de XML con DOM.

Es algo sencillo, es leer y grabar en un xml las putuaciones que se obtienen.

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<lista_puntuaciones>
	<puntuacion fecha="1288122023410">
		<nombre>Mi nombre</nombre>
		<puntos>45000</puntos>
	</puntuacion>
</lista_puntuaciones>


El leer el xml y grabar la primera vez funciona bien, el problema es la segunda vez que se graba, se añade otro elemento.

El resultado es algo así, con el consiguiente error al leer.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<lista_puntuaciones>
	<puntuacion fecha="1288122023410">
		<nombre>Mi nombre</nombre>
		<puntos>45000</puntos>
	</puntuacion>
</lista_puntuaciones>
<lista_puntuaciones>
	<puntuacion fecha="1288122023410">
		<nombre>Mi nombre</nombre>
		<puntos>45000</puntos>
	</puntuacion>
	<puntuacion fecha="128812202381320">
		<nombre>Otro nombre</nombre>
		<puntos>31000</puntos>
	</puntuacion>
</lista_puntuaciones>


El código de la clase que realiza esto es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
package org.example.asteroides;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Vector;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
 
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
 
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;
 
@TargetApi(Build.VERSION_CODES.FROYO)
public class AlmacenPuntuacionesXML_DOM implements AlmacenPuntuaciones {
 
	private static String FICHERO = Environment.getExternalStorageDirectory()
			+ "/puntuaciones_dom.xml";
 
	private Context contexto;
	private Document documento;
	private boolean cargadoDocumento;
 
	public AlmacenPuntuacionesXML_DOM(Context contexto) {
		this.contexto = contexto;
		cargadoDocumento = false;
 
		if (ExisteDirectorioAsteroides()) {
			Log.e("Asteroides", "EXISTEDIRECTORIO Existe carpeta Asteroides");
			Log.e("Asteroides", "EXISTEDIRECTORIO " + FICHERO);
			Log.e("Asteroides",
					"EXISTEDIRECTORIO" + "IndexOf "
							+ FICHERO.indexOf("/Asteroides/"));
			if (FICHERO.indexOf("/Asteroides/") == -1) {
				FICHERO = Environment.getExternalStorageDirectory()
						+ "/Asteroides/puntuaciones_dom.xml";
			}
		} else {
			Log.e("EXISTEDIRECTORIO", "No Existe carpeta Asteroides");
		}
	}
 
	@Override
	public void guardarPuntuacion(int puntos, String nombre, long fecha) {
		try {
			if (!cargadoDocumento) {
 
				// leerXML(contexto.openFileInput(FICHERO));
				leerXML(new FileInputStream(FICHERO));
			}
		} catch (FileNotFoundException e) {
			crearXML();
		} catch (Exception e) {
			Log.e("Asteroides", e.getMessage(), e);
		}
		nuevo(puntos, nombre, fecha);
		try {
			// escribirXML(contexto.openFileOutput(FICHERO,
			// Context.MODE_PRIVATE));
			escribirXML(new FileOutputStream(FICHERO, true));
		} catch (Exception e) {
			Log.e("Asteroides", e.getMessage(), e);
		}
	}
 
	// Nuevo elemento de puntuacion
	public void nuevo(int puntos, String nombre, long fecha) {
		if (cargadoDocumento) {
			Element puntuacion = documento.createElement("puntuacion");
			puntuacion.setAttribute("fecha", String.valueOf(fecha));
			Element e_nombre = documento.createElement("nombre");
			Text texto = documento.createTextNode(nombre);
			e_nombre.appendChild(texto);
			puntuacion.appendChild(e_nombre);
			Element e_puntos = documento.createElement("puntos");
			texto = documento.createTextNode(String.valueOf(puntos));
			e_puntos.appendChild(texto);
			puntuacion.appendChild(e_puntos);
			Element raiz = documento.getDocumentElement();
			raiz.appendChild(puntuacion);
		}
	}
 
	public Vector<String> aVectorString() {
		Vector<String> result = new Vector<String>();
		String nombre = "", puntos = "";
 
		if (cargadoDocumento) {
			Element raiz = documento.getDocumentElement();
			NodeList puntuaciones = raiz.getElementsByTagName("puntuacion");
			for (int i = 0; i < puntuaciones.getLength(); i++) {
				Node puntuacion = puntuaciones.item(i);
				NodeList propiedades = puntuacion.getChildNodes();
				for (int j = 0; j < propiedades.getLength(); j++) {
					Node propiedad = propiedades.item(j);
					String etiqueta = propiedad.getNodeName();
					if (etiqueta != null) {
						if (etiqueta.equals("nombre")) {
							nombre = propiedad.getFirstChild().getNodeValue();
						} else if (etiqueta.equals("puntos")) {
							puntos = propiedad.getFirstChild().getNodeValue();
						}
					}
				}
				result.add(nombre + " " + puntos);
			}
		}
 
		return result;
	}
 
	// Compatible solo a partir API 8 Android
	public void escribirXML(OutputStream salida) throws Exception {
		if (cargadoDocumento) {
			// volcamos el XML al fichero
			TransformerFactory fabrica = TransformerFactory.newInstance();
 
			// añadimos sangrado y la cabecera de XML
			Transformer transformador = fabrica.newTransformer();
			fabrica.setAttribute("indent-number", new Integer(3));
			transformador.setOutputProperty(OutputKeys.INDENT, "yes");
			transformador.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
 
			// hacemos la transformacion
			StreamResult resultado = new StreamResult(salida);
			DOMSource fuente = new DOMSource(documento);
			transformador.transform(fuente, resultado);
 
		}
	}
 
	@Override
	public Vector<String> listaPuntuaciones(int cantidad) {
		try {
			if (!cargadoDocumento) {
				// leerXML(contexto.openFileInput(FICHERO));
				leerXML(new FileInputStream(FICHERO));
			}
		} catch (FileNotFoundException e) {
			crearXML();
		} catch (Exception e) {
			Log.e("Asteroides", e.getMessage(), e);
		}
 
		return aVectorString();
	}
 
	public void crearXML() {
		try {
			DocumentBuilderFactory fabrica = DocumentBuilderFactory
					.newInstance();
			DocumentBuilder constructor = fabrica.newDocumentBuilder();
			documento = constructor.newDocument();
			Element raiz = documento.createElement("lista_puntuaciones");
			documento.appendChild(raiz);
			cargadoDocumento = true;
		} catch (Exception e) {
			Log.e("Asteroides", e.getMessage(), e);
		}
	}
 
	public void leerXML(InputStream entrada) throws Exception {
		DocumentBuilderFactory fabrica = DocumentBuilderFactory.newInstance();
		DocumentBuilder constructor = fabrica.newDocumentBuilder();
		documento = constructor.parse(entrada);
		cargadoDocumento = true;
	}
 
	private boolean ExisteDirectorioAsteroides() {
		String directorioSD = Environment.getExternalStorageDirectory()
				.toString();
 
		String stadoSD = Environment.getExternalStorageState();
		if (!stadoSD.equals(Environment.MEDIA_MOUNTED)) {
			Toast.makeText(contexto, "No puedo leer en la memoria externa",
					Toast.LENGTH_LONG).show();
			return false;
		}
 
		File f = new File(directorioSD, "Asteroides");
 
		if (f == null) { // No ha creado el objeto correctamente
			return false;
		}
 
		if (!f.exists()) { // Existe el directorio Asteroides?
			if (!f.mkdir()) { // No existe lo creamos.
				return false;
			} else {
				return true;
			}
		}
 
		return true;
 
	}
 
}


Remarcar, que la grabación del xml se hace en una carpeta de la tarjeta SD del móvil o tablet.

En principio estaba diseñado el ejemplo de la práctica,para hacerlo en la memoria interna del teléfono/tablet en /data/data/com.android.aplicacion/files

He hecho unas modificaciones, para que grabe en una carpeta concreta dentro de la sd el archivo xml.
Esto mismo lo he hecho con las librerias de XML SAX y no me ha dado ningún problema.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder