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