RSS Unexpected Token,读入xml文件

时间:2015-03-15 22:59:08

标签: java android domdocument rss-reader

我正在尝试创建一个读取Rss Feed的RSS阅读器,并将其显示在列表视图中。我得到了他的其他RSS源,但我不能让它在我真正需要它的Feed上工作。我验证了Feed,它说它是一个没有错误的有效RSS源。我知道问题/解决方案在getDomFromXMLString方法中,它实际上是将XML拉入其中,但我无法弄清楚如何使其正确读取。

这是我的主要活动

package com.example.lehi.events;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {

    String key_items = "item";
    String key_title = "title";
    String key_description = "description";
    String key_link = "link";
    String key_date = "pubDate";
    ListView lstPost = null;
    List<HashMap<String, Object>> post_lists = new ArrayList<HashMap<String, Object>>();
    List<String> lists = new ArrayList<String>();
    ArrayAdapter<String> adapter = null;
    RSSReader rssfeed = new RSSReader();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lstPost = (ListView) findViewById(R.id.lstPosts);
        adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_2, android.R.id.text1, lists) {

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                View view = super.getView(position, convertView, parent);
                TextView txt1 = (TextView) view
                        .findViewById(android.R.id.text1);
                TextView txt2 = (TextView) view
                        .findViewById(android.R.id.text2);
                HashMap<String, Object> data = post_lists.get(position);
                txt1.setText(data.get(key_title).toString());
                txt2.setText(data.get(key_description).toString());
                return view;
            }

        };
        Document xmlFeed;
        xmlFeed = rssfeed.getRSSFromServer("http://calendar.byui.edu/RSSFeeds.aspx?data=hhAbVFpDFO7OxcTcYlM9Lk3inbX%2bJ%2baS3fubTE468TQI91kccS33vQ%3d%3d");
        NodeList nodes = xmlFeed.getElementsByTagName("item");
            for (int i = 0; i < nodes.getLength(); i++) {
                Element item = (Element) nodes.item(i);
                HashMap<String, Object> feed = new HashMap<String, Object>();
                feed.put(key_title, rssfeed.getValue(item, key_title));
                feed.put(key_description, rssfeed.getValue(item, key_description));
                feed.put(key_link, rssfeed.getValue(item, key_link));
                feed.put(key_date, rssfeed.getValue(item, key_date));
                post_lists.add(feed);
                lists.add(feed.get(key_title).toString());
            }
            lstPost.setAdapter(adapter);
    }
}

这是Feed网址 http://calendar.byui.edu/RSSFeeds.aspx?data=hhAbVFpDFO7OxcTcYlM9Lk3inbX%2bJ%2baS3fubTE468TQI91kccS33vQ%3d%3d

由于

编辑: 这是rssfeed被声明为的对象。

import java.io.StringReader;

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

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
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 android.os.StrictMode;

public class RSSReader {
    DefaultHttpClient httpClient = new DefaultHttpClient();

    public Document getRSSFromServer(String url) {
        Document response = null;
        response = getDomFromXMLString(getFeedFromServer(url));
        return response;
    }

    private String getFeedFromServer(String url) {
        String xml = null;
        if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                    .permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }
        try {
            HttpGet httpget =new HttpGet(url);
            HttpResponse httpResponse = httpClient.execute(httpget);
            HttpEntity httpEntity = httpResponse.getEntity();
            xml = EntityUtils.toString(httpEntity);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return xml;
    }

    private Document getDomFromXMLString(String xml) {
        Document doc = null;
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder db = dbf.newDocumentBuilder();
            InputSource is = new InputSource();
            is.setCharacterStream(new StringReader(xml));
            doc = db.parse(is);

        } catch (Exception e) {
        }
        return doc;
    }

    public String getValue(Element item, String key) {
        NodeList nodeList = item.getElementsByTagName(key);
        return this.getElementValue(nodeList.item(0));
    }

    public final String getElementValue(Node node) {
        Node child;
        if (node != null) {
            if (node.hasChildNodes()) {
                for (child = node.getFirstChild(); child != null; child = child
                        .getNextSibling()) {
                    if (child.getNodeType() == Node.TEXT_NODE) {
                        return child.getNodeValue();
                    }
                }
            }
        }
        return "";
    }
}

我想弄明白org.xml.sax.SAXParseException: Unexpected token (position:TEXT @1:4 in java.io.StringReader@19916b6d)

03-15 18:29:08.307    3612-3612/com.example.lehi.events W/System.err﹕ org.xml.sax.SAXParseException: Unexpected token (position:TEXT @1:4 in java.io.StringReader@19916b6d)
03-15 18:29:08.307    3612-3612/com.example.lehi.events W/System.err﹕ at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:146)
03-15 18:29:08.307    3612-3612/com.example.lehi.events W/System.err﹕ at com.example.lehi.events.RSSReader.getDomFromXMLString(RSSReader.java:58)
03-15 18:29:08.307    3612-3612/com.example.lehi.events W/System.err﹕ at com.example.lehi.events.RSSReader.getRSSFromServer(RSSReader.java:29)
03-15 18:29:08.307    3612-3612/com.example.lehi.events W/System.err﹕ at com.example.lehi.events.MainActivity.onCreate(MainActivity.java:56)
03-15 18:29:08.307    3612-3612/com.example.lehi.events W/System.err﹕ at android.app.Activity.performCreate(Activity.java:5933)
03-15 18:29:08.307    3612-3612/com.example.lehi.events W/System.err﹕ at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
03-15 18:29:08.307    3612-3612/com.example.lehi.events W/System.err﹕ at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
03-15 18:29:08.307    3612-3612/com.example.lehi.events W/System.err﹕ at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
03-15 18:29:08.307    3612-3612/com.example.lehi.events W/System.err﹕ at android.app.ActivityThread.access$800(ActivityThread.java:144)
03-15 18:29:08.307    3612-3612/com.example.lehi.events W/System.err﹕ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
03-15 18:29:08.307    3612-3612/com.example.lehi.events W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:102)
03-15 18:29:08.307    3612-3612/com.example.lehi.events W/System.err﹕ at android.os.Looper.loop(Looper.java:135)
03-15 18:29:08.307    3612-3612/com.example.lehi.events W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5221)
03-15 18:29:08.307    3612-3612/com.example.lehi.events W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
03-15 18:29:08.307    3612-3612/com.example.lehi.events W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372)
03-15 18:29:08.308    3612-3612/com.example.lehi.events W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
03-15 18:29:08.308    3612-3612/com.example.lehi.events W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

1 个答案:

答案 0 :(得分:0)

如果getDomFromXMLString中有例外,请尝试打印堆栈跟踪。我猜有一个例外,目前正在被吞并,然后返回的Document就是null

编辑:现在我们看到了SAXParseException: Unexpected token 。那是UTF-8字节顺序标记。试试EntityUtils.toString(httpEntity, "UTF-8"),看看是否有助于吞下BOM。