java - XML 解析器获取 null

标签 java android xml

我尝试解析 XML 文档并将结果添加到列表中。 我每次都变得空了。我不知道我做错了什么。 读取是在主线程之外,最后它调用将 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();

最佳答案

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

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

在这种情况下,它永远不会等于“title”,因为您刚刚测试了它,它等于“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 ,反之亦然。希望这会有所帮助。

关于java - XML 解析器获取 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28311517/

相关文章:

java - 将 html 内容添加到 Liferay 中的页面

java - Tomcat 8 上下文初始化两次

android - 在 textView 中显示短信并且不使用 Toast

xml - XPath 计数为什么它不能本能地工作?

java - 为什么我的字符串没有在我的绘画方法中更新?

java - Servlet请求getParameter的性能

android - BindingAdapter 未按预期工作

android - 如何以编程方式卸载android系统应用程序?

java - 为什么元素创建需要 DOM 中的文档对象?

xml - 在XPath中使用转换功能会产生错误