package my.android.px; import java.net.URL; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; public class ParsingXML extends Activity { private final String MY_DEBUG_TAG = "WeatherForcaster"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.main); TextView tv = new TextView(this); try { /* Create a URL we want to load some xml-data from. */ URL url = new URL( "http://www.anddev.org/images/tut/basic/parsingxml/example.xml"); /* 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. */ xr.parse(new InputSource(url.openStream())); /* 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(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); } } package my.android.px; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.Attributes; 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 namespaceURI, String localName, String qName, Attributes atts) throws SAXException { if (localName.equals("outertag")) { this.in_outertag = true; } else if (localName.equals("innertag")) { 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, start, length)); } } } package my.android.px; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ParsedExampleDataSet { private String extractedString = ""; private int extractedInt = 0; public String getExtractedString() { return extractedString; } public void setExtractedString(String extractedString) { extractedString = eregi_replace("(/r/n|/r|/n|/n/r)", "", extractedString); this.extractedString += extractedString; } public int getExtractedInt() { return extractedInt; } public void setExtractedInt(int extractedInt) { this.extractedInt = extractedInt; } public String toString() { return "ExtractedString = " + this.extractedString + "/nExtractedInt = " + this.extractedInt; } private String eregi_replace(String strFrom, String strTo, String strTarget) { String strPattern = "(?i)" + strFrom; Pattern p = Pattern.compile(strPattern); Matcher m = p.matcher(strTarget); if (m.find()) { return strTarget.replaceAll(strFrom, strTo); } else { return strTarget; } } } <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="my.android.px" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".ParsingXML" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.INTERNET"> </uses-permission> </manifest>