Android: parse XML from string problems

Donut picture Donut · Apr 22, 2011 · Viewed 9.7k times · Source

I've got a custom contentHandler (called XMLHandler), I've been to a lot of sites via Google and StackOverflow that detail how to set that up.

What I do not understand is how to USE it.

Xml.parse(...,...) returns nothing, because it is a void method.

How do I access my parsed XML data?

I realize this question is probably trivial, but I've been searching for (literally) hours and have found no solution.

Please help.

String result = fetchData(doesntmatter);
Xml.parse(result, new XMLHandler());

Answer

Vaibhav Jani picture Vaibhav Jani · Apr 22, 2011

Here is one example i hope it will be usefull to understand "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;
        }

    }

}