¿Hay una manera más fácil de analizar XML en Java?

Estoy tratando de averiguar cómo analizar algunos XML (para una aplicación de Android), y parece bastante ridículo lo difícil que es hacer en Java. Parece que requiere crear un manejador XML que tenga varias devoluciones de llamada (startElement, endElement, etc.), y entonces hay que cuidar de cambiar todos estos datos en objetos. Algo como este tutorial .

Todo lo que realmente necesito es cambiar un documento XML en una matriz multidimensional, e incluso mejor sería tener algún tipo de procesador Hpricot . ¿Hay alguna manera de hacer esto, o tengo que escribir realmente todo el código adicional en el ejemplo arriba?

14 Solutions collect form web for “¿Hay una manera más fácil de analizar XML en Java?”

Hay dos tipos diferentes de procesadores para XML en Java (3 en realidad, pero uno es extraño). Lo que tienes es un analizador de SAX y lo que quieres es un analizador de DOM. Echa un vistazo a http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/ para saber cómo usar el analizador de DOM. DOM creará un árbol con el que podrá navegar fácilmente. SAX es mejor para documentos grandes, pero DOM es mucho más fácil si es más lenta y requiere mucho más memoria.

Prueba http://simple.sourceforge.net , es un XML a la serialización de Java y marco de enlace, es totalmente compatible con Android y es muy ligero, 270K y sin dependencias.

Consulta este artículo para ver cómo manejar XML en Android. Tal vez el estilo DOM o XML Pull se adapte mejor a su estilo

Trabajar con XML en Android

Kyle,

(Por favor, disculpe la naturaleza de auto-promoción de este post … He estado trabajando en esta biblioteca durante meses y todo es de código abierto / Apache 2, por lo que no es egoísta, sólo tratando de ayudar).

Acabo de publicar una biblioteca que estoy llamando SJXP o "Simple Java XML Parser" http://www.thebuzzmedia.com/software/simple-java-xml-parser-sjxp/

Es una capa de abstracción muy pequeña / ajustada (4 clases) que se encuentra encima de cualquier analizador de tracción XML compatible con las especificaciones.

En plataformas Java Android y no Android, el análisis de tracción es probablemente uno de los métodos de análisis más eficaces (tanto en velocidad como en memoria insuficiente). Por desgracia, la codificación directamente en contra de un analizador de tracción termina mirando mucho como cualquier otro código de análisis XML (por ejemplo SAX) – usted tiene manejadores de excepción, manteniendo el estado del analizador, la comprobación de errores, manejo de eventos, análisis de valor, etc.

Lo que hace SJXP le permite definir las "rutas" similares a XPath en un documento de los elementos o atributos que desea que los valores, como:

/ Rss / canal / título

E invocará su devolución de llamada, con el valor, cuando coincida esa regla. La API es realmente sencilla y tiene soporte intuitivo para los elementos calificados para el espacio de nombres, si eso es lo que está intentando analizar.

El código para un analizador estándar sería algo como esto (un ejemplo que analiza un título de feed RSS2):

IRule titleRule = new DefaultRule(Type.CHARACTER, "/rss/channel/title") { @Override public void handleParsedCharacters(XMLParser parser, String text) { // Store the title in a DB or something fancy }} 

Entonces usted acaba de crear una instancia de XMLParser y darle todas las reglas que usted quiere que se preocupan por:

 XMLParser parser = new XMLParser(titleRule); parser.parse(xmlStream); 

Y eso es todo, el analizador invocará el método handler cada vez que coincida la regla. Puede detener el análisis en cualquier momento llamando a parser.stop () si lo desea.

Además (y esto es el verdadero triunfo de esta biblioteca), los elementos y atributos que coinciden con el espacio de nombres son absolutamente sencillos, sólo agrega su URI de espacio de nombres dentro de los corchetes, prefijando el nombre del elemento en tu ruta.

Un ejemplo, digamos que quiere salir del elemento para un feed RSS para que pueda decir en qué idioma está (ref: http://web.resource.org/rss/1.0/modules/dc/ ). Simplemente utilice el URI de espacio de nombres único para ese elemento 'language' con el prefijo 'dc', y la ruta de la regla termina así:

/rss/channel/[http://purl.org/dc/elements/1.1/]language

Lo mismo ocurre con los atributos calificados para el espacio de nombres.

Con toda esa facilidad, la única sobrecarga que agrega al proceso de análisis es una búsqueda de hash O (1) en cada ubicación del documento XML y unos pocos cientos de bytes, tal vez 1k, para el estado de ubicación interno del analizador.

La biblioteca funciona en Android sin dependencias adicionales (ya que la plataforma proporciona un impl org.xmlpull ya) y en cualquier otro tiempo de ejecución de Java agregando la dependencia XPP3.

Esta biblioteca es el resultado de muchos meses de escribir analizadores de trazo personalizados para cada tipo de XML de alimento que hay en cada idioma y darse cuenta (con el tiempo) de que aproximadamente el 90% del análisis se puede destilar en este paradigma realmente básico.

Espero que lo encuentre útil.

A partir de Java 5, hay una biblioteca XPath en el SDK. Vea este tutorial para una introducción a él.

Según mí, usted debe utilizar el analizador de SAX porque: – Rápido – usted puede controlar todo en documento de XML

Usted pagará más tiempo a la codificación, pero es una vez porque usted creará la plantilla del código para analizar XML

Desde el segundo caso, sólo editará el contenido de los cambios.

¡Buena suerte!

He creado una API muy sencilla para resolver precisamente este problema. Es sólo una clase que puede incluir en su base de código y es realmente limpio y fácil de analizar cualquier XML. Lo puedes encontrar aquí:

http://argonrain.wordpress.com/2009/10/27/000/

También puede utilizar Castor para asignar el XML a los beans Java. Lo he usado antes y funciona como un encanto.

Escribir el SAX handler es el mejor camino a seguir. Y una vez que haces eso nunca volverás a otra cosa. Es rápido, simple y se cruza a medida que va, no chupar grandes partes o Dios prohibir un DOM entero en la memoria.

Un par de semanas atrás me golpeó una pequeña biblioteca (un envoltorio alrededor de javax.xml.stream.XMLEventReader ) que permite analizar XML de una manera similar a un analizador de descenso recursivo escrito a mano. La fuente está disponible en github , y un ejemplo de uso simple está abajo. Lamentablemente Android no es compatible con esta API, pero es muy similar a la API XmlPullParser , que es compatible, y el portar no sería demasiado lento.

 accept("tilesets"); while (atTag("tileset")) { String filename = attrib("file"); File tilesetFile = new File(filename); if (!tilesetFile.isAbsolute()) { tilesetFile = new File(FilenameUtils.concat(file.getParent(), filename)); } int tilesize = Integer.valueOf(attrib("tilesize")); Tileset t = new Tileset(tilesetFile, tilesize); t.setID(attrib("id")); tilesets.add(t); accept(); close(); } close(); expect("map"); int width = Integer.valueOf(attrib("width")); int height = Integer.valueOf(attrib("height")); int tilesize = Integer.valueOf(attrib("tilesize")); 

En mi opinión, el uso de XPath para analizar XML puede ser el método de codificación más fácil. Puede incorporar la lógica para extraer nodos de un documento XML en una sola expresión, en lugar de tener que escribir el código para recorrer el gráfico de objetos del documento.

Observo que otra respuesta publicada a esta pregunta ya sugirió usar XPath. Pero aún no para tu proyecto de Android . A partir de ahora, la clase de análisis de XPath todavía no se admite en ninguna versión de Android (aunque el espacio de nombres javax.xml se define en la JVM de Davlik, que podría engañarle, como me hizo al principio).

La inclusión de la clase XPath en Android es un elemento de trabajo actual en fase tardía. (Está siendo probado y depurado por Google mientras escribo esto). Puede seguir el estado de agregar XPath a Davlik aquí : http://code.google.com/p/android/issues/detail?id=515

(Es una molestia que no se pueda asumir que las cosas soportadas en la mayoría de las máquinas virtuales Java están incluidas en la VM Davlik de Android).

Otra opción, mientras espera el apoyo oficial de Google, es JDOM , que actualmente reclama la compatibilidad de VM de Dalvik y también soporte de XPath (en beta). (No he comprobado esto, estoy repitiendo las reclamaciones actuales de su sitio web.)

Hay un muy buen ejemplo muestra para XmlPullParser para cualquier tipo de xml. También podría analizar como una forma genérica, no es necesario cambiar nada para que acaba de obtener esa clase y poner en su proyecto de Android.

Genérico XmlPullParser

Puedes probar esto
http://xml.jcabi.com/
Es una capa adicional en la parte superior de DOM que permite analizar, imprimir y transformar documentos y nodos XML

XML bien no es una tarea fácil.

Su estructura básica es un árbol con cualquier nodo en árbol capaz de sostener un contenedor que consiste en una matriz de más árboles.

Cada nodo en un árbol contiene una etiqueta y un valor pero en adición puede contener un número arbitrario de atributos nombrados, y un número arbitrario de niños o contenedores.

Las tareas de análisis XML tienden a caer en tres categorías.

Cosas que se pueden hacer con "regex". Por ejemplo, desea encontrar el valor de la primera etiqueta "MailTo" y no está interesado en el contenido de ninguna otra etiqueta.

Cosas que usted puede analizar usted mismo. La estructura xml siempre es muy simple, por ejemplo, un nodo raíz y diez etiquetas bien conocidas con valores simples.

¡Todo el resto! A pesar de que un formato de mensaje xml puede parecer engañosamente simples analizadores caseros son fácilmente confundidos por los atributos adicionales, CDATA y los niños inesperados. Los analizadores XML completos pueden manejar todas estas situaciones. Aquí la opción básica es entre un stream o un parser de DOM. Si tiene la intención de usar la mayoría de las entidades / atributos que se dan en el orden en que desea usarlos, entonces un analizador de DOM es ideal. Si sólo está interesado en algunos atributos y tiene la intención de usarlos en el orden en que se presentan, si tiene restricciones de rendimiento o, si los archivos xml son grandes (> 500 MB) que un analizador de flujo es el camino a seguir; El mecanismo de devolución de llamada tiene un poco de "groking", pero en realidad es bastante simple para programar una vez que usted consigue la caída de la misma.

  • cómo encontrar mis errores en el archivo xml
  • configurar el color de fondo en listview
  • Android Maps: No se pudo cargar el mapa. No se pudo contactar con los servidores de Google
  • Cómo generar un entero con los métodos de TextView?
  • ¿Cómo inserto caracteres especiales como texto en el editor de XML para Android?
  • Quiero usar Xpath en Android para analizar XML
  • Tenemos que limpiar todo el proyecto de Android en Eclipse cada vez que se edita un archivo XML
  • Cómo almacenar datos desde un archivo XML a una base de datos SQLite en android
  • Cómo cambiar el tamaño de la pista de TextInputLayout
  • Android error en tutorial no puede encontrar la variable de símbolo activity_display_message
  • ¿Definir un estilo de pintura, color, etc en XML?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.