How can I parse xml from url in android? How can I parse xml from url in android? android android

How can I parse xml from url in android?


Use below Code for parse xml from url in android

public class XMLParsingDOMExample extends Activity {    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        /** Create a new layout to display the view */        LinearLayout layout = new LinearLayout(this);        layout.setOrientation(1);        /** Create a new textview array to display the results */        TextView name[];        TextView website[];        TextView category[];        try {            URL url = new URL("http://www.androidpeople.com/wp-content/uploads/2010/06/example.xml");            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();            DocumentBuilder db = dbf.newDocumentBuilder();            Document doc = db.parse(new InputSource(url.openStream()));            doc.getDocumentElement().normalize();            NodeList nodeList = doc.getElementsByTagName("item");            /** Assign textview array lenght by arraylist size */            name = new TextView[nodeList.getLength()];            website = new TextView[nodeList.getLength()];            category = new TextView[nodeList.getLength()];            for (int i = 0; i < nodeList.getLength(); i++) {                Node node = nodeList.item(i);                name[i] = new TextView(this);                website[i] = new TextView(this);                category[i] = new TextView(this);                Element fstElmnt = (Element) node;                NodeList nameList = fstElmnt.getElementsByTagName("name");                Element nameElement = (Element) nameList.item(0);                nameList = nameElement.getChildNodes();                name[i].setText("Name = " + ((Node) nameList.item(0)).getNodeValue());                NodeList websiteList = fstElmnt.getElementsByTagName("website");                Element websiteElement = (Element) websiteList.item(0);                websiteList = websiteElement.getChildNodes();                website[i].setText("Website = " + ((Node) websiteList.item(0)).getNodeValue());                category[i].setText("Website Category = " + websiteElement.getAttribute("category"));                layout.addView(name[i]);                layout.addView(website[i]);                layout.addView(category[i]);            }        } catch (Exception e) {            System.out.println("XML Pasing Excpetion = " + e);        }        /** Set the layout view to display */        setContentView(layout);    }}


My solution uses the code from the accepted answer however I found that it wouldn't work without using an AsyncTask

Here is my code, first I retrieve the XML and parse it in a method that uses an AsyncTask

public class RetrieveFeed extends AsyncTask {URL url;ArrayList<String> headlines = new ArrayList();ArrayList<String> links = new ArrayList();@Overrideprotected Object doInBackground(Object[] objects) {    // Initializing instance variables    try {        url = new URL("http://feeds.bbci.co.uk/news/rss.xml?edition=uk");        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();        factory.setNamespaceAware(false);        XmlPullParser xpp = factory.newPullParser();        // We will get the XML from an input stream        xpp.setInput(getInputStream(url), "UTF_8");        /* We will parse the XML content looking for the "<title>" tag which appears inside the "<item>" tag.         * However, we should take in consideration that the rss feed name also is enclosed in a "<title>" tag.         * As we know, every feed begins with these lines: "<channel><title>Feed_Name</title>...."         * so we should skip the "<title>" tag which is a child of "<channel>" tag,         * and take in consideration only "<title>" tag which is a child of "<item>"         *         * In order to achieve this, we will make use of a boolean variable.         */        boolean insideItem = false;        // Returns the type of current event: START_TAG, END_TAG, etc..        int eventType = xpp.getEventType();        while (eventType != XmlPullParser.END_DOCUMENT) {            if (eventType == XmlPullParser.START_TAG) {                if (xpp.getName().equalsIgnoreCase("item")) {                    insideItem = true;                } else if (xpp.getName().equalsIgnoreCase("title")) {                    if (insideItem)                        headlines.add(xpp.nextText()); //extract the headline                } else if (xpp.getName().equalsIgnoreCase("link")) {                    if (insideItem)                        links.add(xpp.nextText()); //extract the link of article                }            } else if (eventType == XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("item")) {                insideItem = false;            }            eventType = xpp.next(); //move to next element        }    } catch (MalformedURLException e) {        e.printStackTrace();    } catch (XmlPullParserException e) {        e.printStackTrace();    } catch (IOException e) {        e.printStackTrace();    }return headlines;}    public InputStream getInputStream(URL url) {        try {            return url.openConnection().getInputStream();        } catch (IOException e) {            return null;        }    }public ArrayList<String> heads(){    return headlines;}}

Then in the main activity:

public class MainActivity extends ListActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    ArrayList<String> headlines = new ArrayList<>();    RetrieveFeed getXML = new RetrieveFeed();    getXML.execute();    headlines = getXML.heads();    // Binding data    ArrayAdapter adapter = new ArrayAdapter(this,            android.R.layout.simple_list_item_1, headlines);    setListAdapter(adapter);}}

Make sure you have the correct uses permission in your manifest, put it inside the application tag but outside of any activity tags

<uses-permission android:name="android.permission.INTERNET"/>

and finally when extending ListActivity you ned to make sure you have a ListView in your main layout xml with the id:

android:id="@android:id/list"


use this code .

public class XMLResourceDemo extends ListActivity {private final static String TAG = XMLResourceDemo.class.getSimpleName();TextView selection;ArrayList<String> items = new ArrayList<String>();@Overridepublic void onCreate(Bundle icicle) {    super.onCreate(icicle);    setContentView(R.layout.main);    selection = (TextView) findViewById(R.id.selection);    try {        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();               factory.setNamespaceAware(true);        XmlPullParser xpp = factory.newPullParser();         xpp.setInput(new InputStreamReader(            getUrlData("url")));        while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) {            Log.i(TAG, "doc started");            if (xpp.getEventType() == XmlPullParser.START_TAG) {                if (xpp.getName().equals("entry")) {                    items.add(xpp.getAttributeValue(0));                }            }            xpp.next();        }    } catch (Throwable t) {        Toast.makeText(this, "Request failed: " + t.toString(),                Toast.LENGTH_LONG).show();    }    setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, items));}public InputStream getUrlData(String url) throws URISyntaxException, ClientProtocolException, IOException {    DefaultHttpClient client = new DefaultHttpClient();    HttpGet method = new HttpGet(new URI(url));    HttpResponse res = client.execute(method);    return res.getEntity().getContent();}