Android: analiza XML desde problemas de cadena
Tengo un ContentHandler personalizado (llamado XMLHandler), he estado en muchos sitios a través de Google y StackOverflow que detallan cómo configurar eso.
Lo que no entiendo es cómo usarlo.
- Java.lang.NullPointerException: Intenta invocar el método virtual 'ActionBar.setNavigationMode (int)' en una referencia de objeto nulo
- ¿Cómo puedo hacer un diamante ShapeDrawable?
- Cómo cambiar la casilla de verificación (marcar casilla) color a blanco en android XML
- ¿Cómo se consigue dimension.xml (sw600dp) en Android Studio?
- Android.view.inflateexception binario archivo xml línea # 1 error inflar clase android.widget.relativeLayout
Xml.parse (…, …) no devuelve nada, ya que es un método void.
¿Cómo puedo acceder a mis datos XML analizados?
Me doy cuenta de que esta pregunta es probablemente trivial, pero he estado buscando (literalmente) horas y no he encontrado ninguna solución.
Por favor ayuda.
String result = fetchData(doesntmatter); Xml.parse(result, new XMLHandler());
- Fuera de error de memoria al inflar el diseño xml simple en android
- ¿Cómo representar una relación Many-To-Many en XML o en otro formato de archivo simple?
- Android onfocuschange en xml
- Desplazamiento y desaparición de líneas de código; Problemas con el Editor XML de Eclipse
- ¿Cuál es la diferencia entre @id y @ + id?
- ¿Cómo puedo convertir un diseño PSD a Android xml?
- Cambiar la transición de navegación igual que Volver o Cerrar
- Error al inflarse al extender una clase
He aquí un ejemplo, espero que sea útil para entender "SAXParser"
package test.example; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; public class XMLParsingDemo extends Activity { private final String MY_DEBUG_TAG = "WeatherForcaster"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); /* Create a new TextView to display the parsingresult later. */ TextView tv = new TextView(this); try { /* Create a URL we want to load some xml-data from. */ DefaultHttpClient hc = new DefaultHttpClient(); ResponseHandler <String> res = new BasicResponseHandler(); HttpPost postMethod = new HttpPost("http://www.anddev.org/images/tut/basic/parsingxml/example.xml"); String response=hc.execute(postMethod,res); /* Get a SAXParser from the SAXPArserFactory. */ SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); /* Get the XMLReader of the SAXParser we created. */ XMLReader xr = sp.getXMLReader(); /* Create a new ContentHandler and apply it to the XML-Reader*/ ExampleHandler myExampleHandler = new ExampleHandler(); xr.setContentHandler(myExampleHandler); /* Parse the xml-data from our URL. */ InputSource inputSource = new InputSource(); inputSource.setEncoding("UTF-8"); inputSource.setCharacterStream(new StringReader(response)); /* Parse the xml-data from our URL. */ xr.parse(inputSource); /* Parsing has finished. */ /* Our ExampleHandler now provides the parsed data to us. */ ParsedExampleDataSet parsedExampleDataSet = myExampleHandler.getParsedData(); /* Set the result to be displayed in our GUI. */ tv.setText(response + "\n\n\n***************************************" + parsedExampleDataSet.toString()); } catch (Exception e) { /* Display any Error to the GUI. */ tv.setText("Error: " + e.getMessage()); Log.e(MY_DEBUG_TAG, "WeatherQueryError", e); } /* Display the TextView. */ this.setContentView(tv); } public class ExampleHandler extends DefaultHandler { // =========================================================== // Fields // =========================================================== private boolean in_outertag = false; private boolean in_innertag = false; private boolean in_mytag = false; private ParsedExampleDataSet myParsedExampleDataSet = new ParsedExampleDataSet(); // =========================================================== // Getter & Setter // =========================================================== public ParsedExampleDataSet getParsedData() { return this.myParsedExampleDataSet; } // =========================================================== // Methods // =========================================================== @Override public void startDocument() throws SAXException { this.myParsedExampleDataSet = new ParsedExampleDataSet(); } @Override public void endDocument() throws SAXException { // Nothing to do } /** Gets be called on opening tags like: * <tag> * Can provide attribute(s), when xml was like: * <tag attribute="attributeValue">*/ @Override public void startElement(String uri, String localName, String qName, org.xml.sax.Attributes atts) throws SAXException { super.startElement(uri, localName, qName, atts); if (localName.equals("outertag")) { this.in_outertag = true; } else if (localName.equals("innertag")) { String attrValue = atts.getValue("sampleattribute"); myParsedExampleDataSet.setExtractedString(attrValue); this.in_innertag = true; } else if (localName.equals("mytag")) { this.in_mytag = true; } else if (localName.equals("tagwithnumber")) { // Extract an Attribute String attrValue = atts.getValue("thenumber"); int i = Integer.parseInt(attrValue); myParsedExampleDataSet.setExtractedInt(i); } } /** Gets be called on closing tags like: * </tag> */ @Override public void endElement(String namespaceURI, String localName, String qName) throws SAXException { if (localName.equals("outertag")) { this.in_outertag = false; }else if (localName.equals("innertag")) { this.in_innertag = false; }else if (localName.equals("mytag")) { this.in_mytag = false; }else if (localName.equals("tagwithnumber")) { // Nothing to do here } } /** Gets be called on the following structure: * <tag>characters</tag> */ @Override public void characters(char ch[], int start, int length) { if(this.in_mytag){ myParsedExampleDataSet.setExtractedString(new String(ch)); } } } public class ParsedExampleDataSet { private String extractedString = null; private int extractedInt = 0; public String getExtractedString() { return extractedString; } public void setExtractedString(String extractedString) { this.extractedString = extractedString; } public int getExtractedInt() { return extractedInt; } public void setExtractedInt(int extractedInt) { this.extractedInt = extractedInt; } public String toString(){ return "\n\n\nExtractedString = " + this.extractedString + "\n\n\nExtractedInt = " + this.extractedInt; } } }
Tienes que acceder a tus datos XML en el controlador que has definido por XMLHandler ()
Tienes que anular
public void startElement(String uri, String localName, String qName, org.xml.sax.Attributes atts) throws SAXException { } @Override public void endElement(String namespaceURI, String localName, String qName) { }
y
@Override public void characters(char ch[], int start, int length) { }
- ¿Cómo puedo cambiar el tamaño de un título CheckBox o hacer que envuelva en un xml PreferenceScreen?
- ¿Cómo llamo a window.openDatabase desde un webView hospedado en una aplicación android?