ANDROID: Análisis XML

No soy desarrollador, solo me dedico a la progtwigción. Un área que nunca entiendo es el análisis de XML. Tristemente, para mi último “proyecto” necesito hacer esto mismo para una aplicación de Android. Es un prototipo que estoy haciendo por trabajo.

Tengo este XML (un archivo de maqueta):

      1275243          1077244   1077244       

Tengo un código que me da una 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. Busqué en Google mejores métodos, pero encontré un código más limpio, no pude ponerme a trabajar.

¿Hay algún buen tutorial de Android XML por ahí? ¿O alguien puede ayudarme con este código?

Necesito tener cada uno en un HashMap donde String es la ID.

Line es la clase de toda la información que se muestra.

Gracias Neil

Prefiero no usar DOM ya que tiene una mayor huella de memoria. Con DOM, la estructura XML completa se carga primero en la memoria y luego se procesa. Esta podría no ser la mejor solución para el desarrollo móvil.

Usa el analizador SAX que viene con Android. Es un enfoque impulsado por eventos. Cada etiqueta de inicio, el contenido entre las tags y los eventos de fuego de la etiqueta final cuando ocurren. En realidad, puede manejar más eventos, pero esos son los eventos más comúnmente utilizados. Esto significa que el analizador SAX procesa cada línea una a una sin cargar primero la estructura XML completa en la memoria.

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

EDITAR: 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 feed; private HashMap peroidContent; private HashMap callContent; private HashMap callsMap; private HashMap lineContent; private HashMap 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(); } @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(); peroidContent.put("From", atts.getValue("from")); peroidContent.put("to", atts.getValue("to")); } else if(localName.equalsIgnoreCase("LINE")) { linesMap = new HashMap(); } else if(localName.equalsIgnoreCase("LINE")) { lineContent = new HashMap(); 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(); } else if(localName.equalsIgnoreCase("CALL")) { callContent = new HashMap(); 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 muchas explicaciones sobre StackOverflow sobre cómo analizar un archivo XML. Lo dejé y solo te mostré la parte más interesante; el controlador de contenido.

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

Implementé la interfaz ContentHandler solo para mostrarte que hay más métodos disponibles, tal vez necesitarás uno en el futuro. Sin embargo, puede extender desde la clase DefaultHandler y sobrescribir los métodos necesarios. Todo lo que haces es básicamente verificar la ocurrencia de ciertas tags y luego desencadenar ciertos eventos sobre eso. Si desea conservar el orden de los elementos en el archivo XML, simplemente use un LinkedHashMap lugar de un HashMap .

Espero que ayude.