parse - read xml java android
¿Cómo puedo acelerar el análisis XML de Android? (2)
Use vtd-xml .
Aquí hay algunos puntos de referencia.
Además, el emulador es extremadamente lento, así que pruébalo en un dispositivo real y es probable que veas grandes mejoras.
Buenas tardes (dependiendo de donde vives)!
Soy bastante nuevo en el desarrollo de Android y actualmente estoy trabajando para trasladar la funcionalidad de una aplicación iOS existente a Android. Parte de esta funcionalidad es analizar un archivo XML RSS "grande" (~ 13,000 líneas) que contiene alrededor de 500 entradas. Pasé entre 10 y 15 horas investigando el análisis XML en Android Y probando los principales analizadores XML: DOM, SAX y Pull-Prsing. Aquí están mis resultados, corriendo dentro del ''emulador en mi caja (Windows Vista de 32 bits, CPU dual de 2.2 GHz, 3 GB de RAM):
SAX: ~ 6: 00 minutos
Pull-Parsing: ~ 4: 00 minutos
DOM: más de 4:00 minutos, pero no cronometró cuando tuve esa implementación codificada.
También probé este lector RSS de github, pero tardó> 10:00 minutos:
https://github.com/matshofman/Android-RSS-Reader-Library
Las implementaciones para SAX, PP y DOM se tomaron todas de los subprocesos de stackoverflow.com, por lo que me siento bastante seguro de que no hice nada no estándar en ellas (aunque no estoy descartando eso). He decidido hacer un llamamiento a una multitud más grande y con más experiencia para obtener algunas ideas sobre qué más puedo probar.
No tengo ningún control sobre el formato del archivo. Si estuviera implementando esto de principio a fin, solo escribiría un servicio web que hiciera todo el trabajo pesado en el servidor y luego enviaría una pequeña, compacta, lista de serialización JSON. En cambio, tengo el archivo de línea 13K. :)
¿Alguna idea de lo que puedo hacer? Parece ser un problema bastante común, pero la mayoría de las respuestas solo dicen probar uno de los principales analizadores XML. En mi caso, he probado los tres e incluso el más rápido parece demasiado lento.
¿Qué estoy haciendo mal? ¿Hay algún problema normal de "novato" que la gente suele encontrar al analizar XML en la red de Android?
¡Gracias de antemano por cualquier ayuda que pueda brindar!
Estoy de acuerdo con la respuesta de Jave . La mejor opción es la biblioteca VDT-XML Este ejemplo demuestra cómo puede usar esta biblioteca.
Archivo XML:
<database name="products">
<table name="category">
<column name="catId">20</column>
<column name="catName">Fruit</column>
</table>
<table name="category">
<column name="catId">31</column>
<column name="catName">Vegetables</column>
</table>
<table name="category">
<column name="catId">45</column>
<column name="catName">Rice</column>
</table>
<table name="category">
<column name="catId">50</column>
<column name="catName">Potatoes</column>
</table>
</database>
Ejemplo del código fuente:
import com.ximpleware.AutoPilot;
import com.ximpleware.VTDGen;
import com.ximpleware.VTDNav;
String fileName = "products.xml";
VTDGen vg = new VTDGen();
if (vg.parseFile(fileName, true)) {
VTDNav vn = vg.getNav();
AutoPilot table = new AutoPilot(vn);
table.selectXPath("database/table");
while (table.iterate()) {
String tableName = vn.toString(vn.getAttrVal("name"));
if (tableName.equals("category")) {
AutoPilot column = new AutoPilot(vn);
column.selectElement("column");
while (column.iterate()) {
String text = vn.toNormalizedString(vn.getText());
String name = vn.toString(vn.getAttrVal("name"));
if (name.equals("catId")) {
Log.d("Category ID = " + text);
} else if (name.equals("catName")) {
Log.d("Category Name = " + text);
}
}
}
}
}
funciona para mí y espero que te ayude.