2012-08-22 5 views
9

Attualmente sto usando un xml che è stato scaricato e analizzato da lì. Mi piacerebbe farlo direttamente dall'URL stesso. Come lo posso fare?Come posso analizzare xml da url in Android?

Ho aggiunto lo snippet che sto usando qui sotto. Gentilmente aiuto con un frammento di codice o un esempio. Grazie.

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
File file = new File(this.getFilesDir(), FILE_EXTRACTED); 
Document dom = builder.parse(file); 
Element root = dom.getDocumentElement(); 
root.normalize(); 

risposta

24

Usa sotto codice per XML analizzano da 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); 

    } 
} 
+4

non lo faccio kown se funziona perché non usa un metodo task asincrono – Bachask8

5

utilizzare questo codice.

public class XMLResourceDemo extends ListActivity { 

private final static String TAG = XMLResourceDemo.class.getSimpleName(); 
TextView selection; 
ArrayList<String> items = new ArrayList<String>(); 

@Override 
public 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(); 
} 
+0

Posso apportare modifiche al frammento di codice che ho dato a chiamare URL per l'analisi .. – Karthik

+0

utilizzando il codice sopra è possibile ottenere il documento xml dall'URL da cui è possibile analizzare xml. –

+0

sono stato modificato la mia risposta controlla questo ti aiuterà. –

8

mia soluzione utilizza il codice della risposta accettata però ho scoperto che non avrebbe funzionato senza utilizzare un AsyncTask

Ecco il mio codice, prima recuperiamo l'XML e lo analizzo in un metodo che utilizza un AsyncTask

public class RetrieveFeed extends AsyncTask { 

URL url; 
ArrayList<String> headlines = new ArrayList(); 
ArrayList<String> links = new ArrayList(); 
@Override 
protected 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; 
} 
} 

Poi nell'attività principale:

public class MainActivity extends ListActivity { 

@Override 
protected 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); 

} 
} 

Assicurati di avere il corretto permessi usi nella tua manifesta, metterlo all'interno del tag applicazione, ma al di fuori di qualsiasi tag di attività

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

e, infine, quando si estende ListActivity ned per assicurarsi di avere un controllo ListView in XML di layout principale con l'id:

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

Soluzione e spiegazione perfette, grazie :-) – Swr7der

+0

È meglio usare xpp.setInput (url.openConnection(). getInputStream(), "UTF_8"); invece di xpp.setInput (getInputStream (url), "UTF_8"); –