Estoy trabajando en una aplicación de Android que interactúa con una cámara bluetooth. Para cada clip almacenado en la cámara almacenamos algunos campos sobre el clip (algunos de los cuales el usuario puede cambiar) en un archivo XML.Cómo conservar nodos XML que no están vinculados a un objeto cuando se utiliza SAX para el análisis
Actualmente, esta aplicación es la única que escribe estos datos xml en el dispositivo, pero en el futuro es posible que una aplicación de escritorio o una aplicación de iPhone también pueda escribir datos aquí. No quiero suponer que otra aplicación tampoco podría tener campos adicionales (especialmente si tenían una versión más nueva de la aplicación que agregaba nuevos campos que esta versión aún no era compatible).
Lo que quiero evitar es una situación en la que agregamos nuevos campos a este archivo XML en otra aplicación, y luego el usuario va a usar la aplicación de Android y borra esos otros campos porque no conoce ellos.
por lo que permite tomar ejemplo hipotético:
<data>
<title>My Title</title>
<date>12/24/2012</date>
<category>Blah</category>
</data>
cuando se lee desde el dispositivo de esto traduce a un objeto de clip que tiene este aspecto (simplificado por razones de brevedad)
public class Clip {
public String title, category;
public Date date;
}
Así que' m usando SAX para analizar los datos y almacenarlos en un Clip. Simplemente almaceno los caracteres en StringBuilder y los escribo cuando llego al elemento final para título, categoría y fecha.
Me di cuenta de que cuando escribiera estos datos de nuevo en el dispositivo, si hubiera otras etiquetas en el documento original, no se escribirían porque solo escribo los campos que conozco.
Esto me hace pensar que tal vez SAX es la opción incorrecta y tal vez debería usar DOM o alguna otra cosa donde podría escribir más fácilmente cualquier otro elemento que existiera originalmente.
Ocasionalmente estaba pensando que tal vez mi clase Clip contiene una ArrayList de algún tipo XML genérico (quizás DOM), y en startTag compruebo si el elemento no es una de las etiquetas predefinidas, y si es así, hasta que llego al final de esa etiqueta, almaceno toda la estructura (¿pero en qué?). Luego, al escribir de nuevo, revisaría todas las etiquetas adicionales y las escribiría en el archivo xml (junto con los campos que conozco, por supuesto)
¿Es este un problema común con una buena solución conocida?
- Actualización 5/22/12 -
No he mencionado que en el XML real del nodo raíz (en realidad se llama anotación), se utiliza un número de versión que ha sido puesto a 1. Lo Lo que haré a corto plazo es requerir que el número de versión que admite mi aplicación sea> = cuál es el número de versión de los datos xml. Si el xml es un número mayor, intentaré analizarlo para su posterior lectura, pero denegaré cualquier guarda en el modelo. Todavía estoy interesado en cualquier tipo de ejemplo de trabajo sobre cómo hacer esto.
BTW Pensé en otra solución que debería ser bastante fácil. Me imagino que puedo usar XPATH para encontrar nodos que conozco y reemplazar el contenido de esos nodos cuando se actualicen los datos. Sin embargo, ejecuté algunos puntos de referencia y la sobrecarga es absurda al analizar el xml cuando se analiza en la memoria. Solo la operación de análisis sin siquiera hacer ninguna búsqueda resultó en un rendimiento 20 veces peor que SAX. El uso de xpath fue entre 30 y 50 veces más lento en general para el análisis sintáctico, lo que fue realmente malo considerando que los analicé en una vista de lista. Así que mi idea es mantener el SAX para analizar los nodos a los clips, pero almacenar la totalidad del XML en una variable de la clase Clip (recuerde, este xml es corto, menos de 2kb). Luego, cuando vaya a volver a escribir los datos, podría usar XPATH para reemplazar los nodos que conozco en el XML original.
Sin embargo, todavía estoy interesado en otras soluciones. Probablemente no acepte una solución, a menos que incluya algunos ejemplos de código.
Actualicé mi respuesta con la implementación que se mantiene con el modelo SAX y utiliza 'XMLFilter's. Agrega una pequeña sobrecarga de mantener la grabación de los eventos en memoria (aunque el modelo de objeto es muy simple). ver si te gusta esa –
¡Muy buena solución! No creo que los gastos generales consideren mucho, en la mayoría de los casos, no habrá ningún nodo adicional. –