ANDROID: Análisis de XML

No soy un desarrollador, sólo me dedico a la programación. Un área que nunca entiendo es el análisis XML. Lamentablemente, para mi último "proyecto" tengo que hacer esto mismo para una aplicación para Android. Es un prototipo que estoy haciendo para el trabajo.

Tengo este XML (un archivo de mock-up):

<feed version="201010011221" > <period from="2010-10-01T10:08:34Z" to="2010-10-01T10:08:34Z"> <lines> <line id="SKI" name="Ski" shortname="ski" status="1 calls queued"> <calls> <call id="6584" created="2010-10-01T11:22:42Z"> <booking>1275243</booking> </call> </calls> </line> <line id="CRU" name="Cruise" shortname="cruise" status="0 calls queued"> <calls /> </line> <line id="VIL" name="Villas" shortname="villas" status="2 calls queued"> <calls> <call id="25878" created="2010-10-01T10:22:42Z"> <booking>1077244</booking> </call> <call id="25878" created="2010-10-01T10:22:42Z"> <booking>1077244</booking> </call> </calls> </line> </lines> </period> </feed> 

Tengo un código que me da un NodeList de cada uno:

 inputStream = OpenHttpConnection(URL); Document document = null; DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder; documentBuilder = documentBuilderFactory.newDocumentBuilder(); document = documentBuilder.parse(inputStream); document.getDocumentElement().normalize(); NodeList lineNodes = document.getElementsByTagName("line"); 

No estoy seguro de qué hacer a continuación. Mi código parece bastante largo para esto. He googled para mejores métodos, pero algunos código más limpio que encontré, no pude conseguir a trabajar.

¿Hay buenos tutoriales de Android XML por ahí? ¿O puede alguien ayudarme con este código?

Necesito conseguir cada uno en un HashMap donde la secuencia es la identificación.

La línea es la clase de toda la información mostrada.

Gracias Neil

Preferiría no utilizar DOM, ya que tiene una mayor huella de memoria. Con DOM toda la estructura XML se carga primero en la memoria y luego se está procesando. Esto podría no ser la mejor solución para el desarrollo móvil.

Utilice el analizador SAX que viene con Android. Es un enfoque impulsado por eventos. Cada etiqueta de inicio, el contenido entre las etiquetas y la etiqueta de fin de los eventos de incendios cuando se producen. En realidad, puede manejar más eventos, pero esos son los eventos más comúnmente utilizados. Esto significa que el analizador de SAX procesa cada línea una por una sin cargar primero toda la estructura XML en la memoria.

Voy a publicar un ejemplo para su problema particular mañana.

EDIT: Aquí está el ejemplo del controlador de contenido prometido.

 import java.util.HashMap; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; public class MyContentHandler implements ContentHandler { private HashMap<String, Object> feed; private HashMap<String, Object> peroidContent; private HashMap<String, Object> callContent; private HashMap<String, Object> callsMap; private HashMap<String, Object> lineContent; private HashMap<String, Object> linesMap; private String text; private String callId; private String lineId; @Override public void startDocument() throws SAXException { /* You can perform some action in this method * for example to reset some sort of Collection * or any other variable you want. It gets called * every time a document starts. */ feed = new HashMap<String, Object>(); } @Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { // Gets called every time an opening tag is encountered. if(localName.equalsIgnoreCase("FEED")) { /* We've found a "feed" opening tag so we capture its * version attribute and put it into our HashMap.*/ feed.put("Version", atts.getValue("version")); } else if(localName.equalsIgnoreCase("PEROID")) { peroidContent = new HashMap<String, Object>(); peroidContent.put("From", atts.getValue("from")); peroidContent.put("to", atts.getValue("to")); } else if(localName.equalsIgnoreCase("LINE")) { linesMap = new HashMap<String, Object>(); } else if(localName.equalsIgnoreCase("LINE")) { lineContent = new HashMap<String, Object>(); lineId = atts.getValue("id"); lineContent.put("name", atts.getValue("name")); lineContent.put("shortname", atts.getValue("shortname")); lineContent.put("status", atts.getValue("status")); } else if(localName.equalsIgnoreCase("CALLS")) { callsMap = new HashMap<String, Object>(); } else if(localName.equalsIgnoreCase("CALL")) { callContent = new HashMap<String, Object>(); callId = atts.getValue("Id"); callContent.put("created", atts.getValue("created")); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { /* Gets called every time in between an opening tag and * a closing tag if characters are encountered. */ text = new String(ch, start, length); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // Gets called every time a closing tag is encountered. if(localName.equalsIgnoreCase("FEED")) { feed.put("Peroid", peroidContent); } else if(localName.equalsIgnoreCase("PEROID")) { peroidContent.put("Lines", linesMap); } else if(localName.equalsIgnoreCase("LINES")) { linesMap.put(lineId, lineContent); } else if(localName.equalsIgnoreCase("LINE")) { lineContent.put("Calls", callsMap); } else if(localName.equalsIgnoreCase("CALLS")) { callsMap.put(callId, callContent); } else if(localName.equalsIgnoreCase("BOOKING")) { callContent.put("Booking", text.toString()); } } @Override public void endDocument() throws SAXException { /* You can perform some action in this method * for example to reset some sort of Collection * or any other variable you want. It gets called * every time a document end is reached. */ SAXParsingFun.setHashMap(feed); } @Override public void endPrefixMapping(String prefix) throws SAXException { // TODO Auto-generated method stub } @Override public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub } @Override public void processingInstruction(String target, String data) throws SAXException { // TODO Auto-generated method stub } @Override public void setDocumentLocator(Locator locator) { // TODO Auto-generated method stub } @Override public void skippedEntity(String name) throws SAXException { // TODO Auto-generated method stub } @Override public void startPrefixMapping(String prefix, String uri) throws SAXException { // TODO Auto-generated method stub } } 

Hay un montón de explicaciones sobre StackOverflow sobre cómo analizar un archivo XML que he dejado que fuera y acaba de mostrar la parte más interesante; El controlador de contenido.

Ahora la mayoría de las partes interesantes se comentan para que puedas entender lo que estoy tratando de hacer.

He implementado la interfaz ContentHandler sólo para mostrar que hay más métodos disponibles, tal vez necesite uno de ellos en el futuro. Sin embargo, puede extenderse desde la clase DefaultHandler y simplemente sobrescribir los métodos necesarios. Todo lo que haces es básicamente buscar la aparición de ciertas etiquetas y luego activar ciertos eventos sobre eso. Si desea conservar el orden de los elementos en el archivo XML, simplemente utilice un LinkedHashMap lugar de un HashMap .

Espero que ayude.

  • IllegalArgumentException: Unknown Contenido de URL: // CONTENT
  • Mantener los métodos Java llamados desde Android JNI
  • ¿Cómo decirle a ProGuard que ofusque métodos y nombres de clase?
  • ¿Por qué la adición de variables locales causa retraso en el método?
  • Implementar seguridad a nivel de firma en los servicios de Android con más de una firma permitida
  • Cómo descodificar el char unicode en cadena de Java?
  • ¿Existe una sofisticada API Java WorkQueue?
  • El tamaño del mapa de bits supera el error de presupuesto de Vm android
  • URLConnection getContentLength () devuelve un valor negativo
  • Código de ejemplo para manejar Excepciones
  • Void ... params significado en java function declaration
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.