Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android: parse XML from string problems

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());
like image 413
Donut Avatar asked Apr 22 '11 04:04

Donut


2 Answers

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;
        }

    }

}
like image 152
Vaibhav Jani Avatar answered Sep 30 '22 15:09

Vaibhav Jani


You have to access your XML data into handler which you have define by XMLHandler()

you have to override

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

}

and

@Override
    public void characters(char ch[], int start, int length) {

    }
like image 39
Dharmendra Avatar answered Sep 30 '22 17:09

Dharmendra