XML解析器变为null

时间:2015-02-04 00:41:18

标签: java android xml

我尝试解析XML文档并将结果添加到列表中。 我每次都变空了。我不知道我做错了什么。 读取在主线程之外,最后它调用mathod将Intent发送到另一个Activity。 您可以在代码中查看URL中的XML。 谢谢回答。 这是我的代码:

    t = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                URL url = new URL(
                        "http://www.ynet.co.il/Integration/StoryRss4880.xml");
                XmlPullParserFactory factory = XmlPullParserFactory
                        .newInstance();
                factory.setNamespaceAware(false);
                XmlPullParser xpp = factory.newPullParser();
                xpp.setInput(getInputStream(url), "UTF_8");
                boolean insideItem = false;
                int eventType = xpp.getEventType();
                String l = null;
                String tit = null;
                String p = null;
                while (eventType != XmlPullParser.END_DOCUMENT) {                       
                    if (eventType == XmlPullParser.START_TAG) {
                        if (xpp.getName().equalsIgnoreCase("item")) {
                            insideItem = true;
                            if (xpp.getName().equalsIgnoreCase("title")) {
                                if (insideItem) {
                                    l = xpp.nextText();
                                }
                            } else if (xpp.getName().equalsIgnoreCase(
                                    "link")) {
                                if (insideItem) {
                                    tit = xpp.nextText();
                                }
                            } else if (xpp.getName().equalsIgnoreCase(
                                    "description")) {
                                if (insideItem) {
                                    String array[] = xpp.nextText().split(
                                            "img src='");
                                    String array1[] = array[1]
                                            .split("' alt");
                                    p = array1[0];
                                }
                            }
                            MyArticle.getInstance().getmArticle()
                                    .add(new Article(l, tit, p));
                        }
                    } else if (eventType == XmlPullParser.END_TAG
                            && xpp.getName().equalsIgnoreCase("item")) {
                        insideItem = false;
                    }
                    eventType = xpp.next();
                }
                if (eventType == XmlPullParser.END_DOCUMENT) {                  
                        try {
                            t.join();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        GoTOActivity(context);

                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (XmlPullParserException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });
    t.start();

1 个答案:

答案 0 :(得分:0)

问题在于你的内部解析循环。您测试xpp.getName()是否等于“item”,如果是,则将 insideItem 设置为true,然后立即测试xpp.getName()是否等于“title”:< / p>

if (xpp.getName().equalsIgnoreCase("item")) {
    insideItem = true;
    if (xpp.getName().equalsIgnoreCase("title")) {
        if (insideItem) {
            l = xpp.nextText();
        }
    }

在这种情况下它永远不会等于“标题”,因为你只是测试了它并且它等于“item”。在测试“title”之前,您需要读取下一个XML开始标记,如下所示:

while (eventType != XmlPullParser.END_DOCUMENT) {                       
    if (eventType == XmlPullParser.START_TAG) {
        if (xpp.getName().equalsIgnoreCase("item")) {
            insideItem = true;
            tit = null; l = null; p = null; // clear variables
        } else if (xpp.getName().equalsIgnoreCase("title")) {
            if (insideItem) {
                tit = xpp.nextText();
            }
        } else if (xpp.getName().equalsIgnoreCase("link")) {
            if (insideItem) {
                l = xpp.nextText();
            }
        } else if (xpp.getName().equalsIgnoreCase("description")) {
            if (insideItem) {
                String array[] = xpp.nextText().split(
                        "img src='");
                String array1[] = array[1]
                        .split("' alt");
                p = array1[0];
            }
        }
    } else if (eventType == XmlPullParser.END_TAG
            && xpp.getName().equalsIgnoreCase("item")) {
        insideItem = false;                         
        MyArticle.getInstance().getmArticle()
                .add(new Article(l, tit, p));                            
    }
    eventType = xpp.next();
}

另请注意,添加新文章的代码会在您检测到“item”关闭标记的位置。最后,我假设 tit 是标题而 l 是链接,在这种情况下你需要交换它们,所以当你读到 tit 时标题,反之亦然。希望这会有所帮助。