2011-04-22 20 views
6

Tengo un ContentHandler personalizado (llamado XMLHandler), he estado en muchos sitios a través de Google y StackOverflow que detallan cómo configurarlo.Android: analizar XML de problemas de cadena

Lo que no entiendo es cómo usarlo.

Xml.parse (..., ...) no devuelve nada, porque es un método nulo.

¿Cómo accedo 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()); 
+0

¿Puedes publicarle XMLhandler? –

Respuesta

12

Aquí es un ejemplo que espero que será muy ú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; 
     } 

    } 

} 
+1

Gracias, esto es exactamente lo que necesitaba. – Donut

1

Usted tiene que acceder a sus datos XML en gestor que tiene definir por XMLHandler()

tiene que reemplazar

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) { 

    } 
+0

Ya tengo un controlador y lo especifiqué en la pregunta. Mi pregunta es ¿cómo la uso? Vaibhav Jani respondió con un ejemplo. – Donut

+0

¿Qué pasa si mi cadena contiene enter o algunos caracteres especiales? – MobileEvangelist

+0

Crea un búfer String y agrega la cadena al búfer hasta que la etiqueta finalice. – Dharmendra