Android - XMLPullParser无法解析整个文件

时间:2015-12-06 20:10:20

标签: android xml parsing xmlpullparser

我是初学者,在从网站解析XML时遇到很多困难。

以下是在将XML下载到文件后解析XML的代码:

public RSSFeed readFile() throws FileNotFoundException {
    RSSFeed feed = new RSSFeed();
    RSSLocation location = new RSSLocation();
    RSSTime time = new RSSTime();
    XmlPullParser parser = Xml.newPullParser();
    InputStream inputStream = context.openFileInput(FILENAME);

    try {
        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
        parser.setInput(inputStream,null);

        int eventType = parser.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {
            if(eventType == XmlPullParser.START_TAG){
                // yweather:forecast - forecast is name of the element, yweather is namespace
                Log.d("Parser Name", parser.getName());
                Log.d("Parser Text", parser.getText());
                Log.d("Parser Desc", parser.getPositionDescription());
            }
            eventType = parser.next();
        }
    } catch (Exception e) {
        Log.e("XML Parser", e.toString());
    }

    return feed;
}

以下是XML文件:http://api.openweathermap.org/data/2.5/forecast?lat=40.2845939&lon=-75.6475172&mode=xml&cnt=3&appid=2de143494c0b295cca9337e1e96b00e0

我只是想看看如何解析数据,以便我可以适当地分配对象及其属性。

我只想在日志中看到基于每个方法返回的内容(getName(),getText(),getAttributeValue()...)

但是,当我使用上面的代码将信息发送到日志时,它只获取第一个标记<weatherdata>并返回NullPointerException:println需要一条消息给文本。

这是logcat:

12-06 14:52:30.009 17507-17557/com.example.shortn1.whattowear E/XML Parser: java.lang.NullPointerException: println needs a message
12-06 14:52:30.049 17507-17507/com.example.shortn1.whattowear D/Weather Feed: Feed displayed
12-06 14:52:50.849 17507-17554/com.example.shortn1.whattowear D/Parser Name: weatherdata
12-06 14:52:50.849 17507-17554/com.example.shortn1.whattowear E/XML Parser: java.lang.NullPointerException: println needs a message
12-06 14:52:50.889 17507-17507/com.example.shortn1.whattowear D/Weather Feed: Feed displayed
12-06 14:53:10.874 17507-17856/com.example.shortn1.whattowear D/Parser Name: weatherdata
12-06 14:53:10.874 17507-17856/com.example.shortn1.whattowear E/XML Parser: java.lang.NullPointerException: println needs a message
12-06 14:53:10.919 17507-17507/com.example.shortn1.whattowear D/Weather Feed: Feed displayed
12-06 14:53:30.809 17507-17557/com.example.shortn1.whattowear D/Parser Name: weatherdata
12-06 14:53:30.809 17507-17557/com.example.shortn1.whattowear E/XML Parser: java.lang.NullPointerException: println needs a message
12-06 14:53:30.839 17507-17507/com.example.shortn1.whattowear D/Weather Feed: Feed displayed

我的主要活动太长,无法在此处发布,但有一个位置查找器,在onLocationChanged()中调用该方法来下载与该人的位置相对应的xml。返回文件后,将调用readFile()方法。读取文件后,将调用另一个方法(记录“Feed显示”)。

我还尝试将XML Parser更改为仅通过添加&& parser.getName().equals("name")从XML中获取“name”字段,但它仍然只读取“name”一词并且不返回名称的值。

有什么建议吗?所有帮助表示赞赏!!谢谢你。

1 个答案:

答案 0 :(得分:0)

您获得的错误与Log.d有关,其两个参数必须与null不同且非空。似乎parser.getText()正在返回null,导致Exceptionwhile循环的结束(这就是为什么它只输出第一个标记)。

尝试这样做:

String name = parser.getName();
String text = parser.getText();
String positionDescription = parser.getPositionDescription();

Log.d("Parser Name", name != null && !name.equals("") ? name : "---");
Log.d("Parser Text", text != null && !text.equals("") ? text : "---");
Log.d("Parser Desc", positionDescription != null && !positionDescription.equals("") ? positionDescription : "---");

这应该输出文档的其余部分,每当其中一个解析器方法返回null或为空时输出将为---

修改

要获取代码中的文字,您必须将代码更改为:

while (eventType != XmlPullParser.END_DOCUMENT)
{
    if(eventType == XmlPullParser.START_TAG)
    {
        String name = parser.getName();
        String positionDescription = parser.getPositionDescription();

        Log.d("Parser Name", name != null && !name.equals("") ? name : "---");
    }
    else if(eventType == XmlPullParser.TEXT)
    {
        String text = parser.getText();
        Log.d("Parser Text", text != null && !text.equals("") ? text : "---");
    }
    eventType = parser.next();
}