2012-08-22 25 views
9

Actualmente estoy usando un xml que se ha descargado y analizado desde allí. Me gustaría hacerlo directamente desde la url misma. ¿Cómo puedo hacer eso?¿Cómo puedo analizar xml desde url en android?

He agregado el fragmento que estoy usando a continuación. Amablemente ayuda con un fragmento o ejemplo. Gracias.

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

Respuesta

24

Uso de abajo Código de XML analizan desde una URL en 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

No sé si funcionará, ya que no está utilizando un método de tarea asíncrono – Bachask8

5

utilizan este código.

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

¿Puedo hacer cualquier cambio en el fragmento anterior que he dado a llamar url para analizar .. – Karthik

+0

mediante el uso del código anterior, puede obtener el documento xml de la URL desde la que puede analizar XML. –

+0

me editaron mi respuesta, comprueba que esto te ayudará ... –

8

Mi solución utiliza el código de la respuesta aceptada sin embargo he encontrado que no funcionaría sin el uso de un AsyncTask

Aquí está mi código, primero recupero el XML y lo analizo en un método que usa una 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; 
} 
} 

Luego, en la actividad principal:

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

} 
} 

Asegúrate de que tienes el permiso usos correctos en su manifiesto, lo puso dentro de la etiqueta de la aplicación, pero fuera de cualquier etiqueta de actividad

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

y, finalmente, al extender ListActivity lo que ned asegurarse de que tiene un ListView en su diseño xml principal con el id:

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

Solución perfecta y explicación, gracias :-) – Swr7der

+0

Es mejor usar xpp.setInput (url.openConnection(). getInputStream(), "UTF_8"); en lugar de xpp.setInput (getInputStream (url), "UTF_8"); –

Cuestiones relacionadas