如何从rss获取数据?

时间:2013-11-28 09:12:21

标签: java android xml xml-parsing rss

我无法从rss获取数据... null异常 我从这个link中检索,它只有

<?xml version="1.0" encoding="utf-8"?>
<GoldQuotes>
  <Price Date="2013-11-28 09:22" Value="1244.30" />
  <Price Date="2013-11-28 09:20" Value="1243.10"/>
  <Price Date="2013-11-28 09:18" Value="1243.30"/>
  [...]
</GoldQuotes>

这是我的java片段代码

if (responseCode == HttpURLConnection.HTTP_OK) {
    InputStream in = httpConnection.getInputStream();
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document dom = db.parse(in);
    Element docEle = dom.getDocumentElement();

    NodeList nl = docEle.getElementsByTagName("GoldQuotes");  //*** 

    if ((nl != null) && (nl.getLength() > 0)) {
        for (int i = 0; i < nl.getLength(); i++) {

              dissectNode(nl, i);
        }
   }//if 

[...]

public void dissectNode(NodeList nl, int i) {
    try {

             Element entry = (Element) nl.item(i);
         Element price = (Element) entry.getElementsByTagName("Price").item(0); 
         String priceValue = price.getAttribute("Value"); //get gold value

       SingleNewsItem singleItem = new SingleNewsItem(priceValue);
        newsList.add(singleItem);

        } catch (DOMException e) {
            e.printStackTrace();
        }
    }// dissectNode

我做NodeList nl = docEle.getElementsByTagName("GoldQuotes")之后。我用nl.getLength()测试,返回0 .. 我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

试试这个..

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.ProgressDialog;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {

    String url = "https://www.igolder.com/GoldData.ashx?type=Historical&hours=24&currency=USD&tz=UTC&unit=oz&output=xml";
    ProgressDialog pDialog;


    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);    

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
            new XmlParsing(url).executeOnExecutor(
                    AsyncTask.THREAD_POOL_EXECUTOR, new String[] { null });
        else
            new XmlParsing(url).execute(new String[] { null });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    public class XmlParsing extends AsyncTask<String, Void, String> {

        // variables passed in:
        String urls;

        // constructor
        public XmlParsing(String urls) {
            this.urls = urls;
        }

        @Override
        protected void onPreExecute() {
            pDialog = ProgressDialog.show(NetActivity.this,
                    "Fetching Details..", "Please wait...", true);
        }

        @Override
        protected String doInBackground(String... params) {
            // TODO Auto-generated method stub

            URL url;
            try {

                url = new URL(urls);
                DocumentBuilderFactory dbf = DocumentBuilderFactory
                        .newInstance();
                DocumentBuilder db = dbf.newDocumentBuilder();
                Document doc = db.parse(new InputSource(url.openStream()));

                doc.getDocumentElement().normalize();

                NodeList nodeList = doc.getElementsByTagName("GoldQuotes");

                for (int i = 0; i < nodeList.getLength(); i++) {

                    Node node = nodeList.item(i);

                    Element fstElmnt = (Element) node;
                    NodeList nameList = fstElmnt.getElementsByTagName("Price");
                    Element nameElement = (Element) nameList.item(0);
                    nameList = nameElement.getChildNodes();
                    String priceValue = nameElement.getAttribute("Value"); //get gold value

                    SingleNewsItem singleItem = new SingleNewsItem(priceValue);
                    newsList.add(singleItem);

                    System.out.println("Value : "
                            + (nameElement.getAttribute("Value")));
                }

            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ParserConfigurationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SAXException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            // Now we have your JSONObject, play around with it.
            if (pDialog.isShowing())
                pDialog.dismiss();
        }

    }
}

答案 1 :(得分:1)

您尝试解析的文档不是rss,只是自定义xml格式。在解析它之后,就足以修改我们的代码了:

// this returns the root element, ie "GoldQuotes"
Element docEle = dom.getDocumentElement();

// get the list of Price elements children of the root
NodeList nl = docEle.getElementsByTagName("Price"); 

if ((nl != null) && (nl.getLength() > 0)) {
    for (int i = 0; i < nl.getLength(); i++) {
         // get the i-th Price element from the nodelist
         Element entry = (Element) nl.item(i);
         // get its Value attribute
         String priceValue = entry.getAttribute("Value");
         [....]
    }

}