【问题标题】:Android - XMLPullParser not parsing entire fileAndroid - XMLPullParser 不解析整个文件
【发布时间】:2015-12-06 20:10:19
【问题描述】:

我是初学者,在从网站解析 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 needs a message for the Text。

这里是日志:

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() 方法。读取文件后,调用另一个方法(记录“显示的提要”)。

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

有什么建议吗?感谢所有帮助!提前谢谢你。

【问题讨论】:

    标签: android xml parsing xmlpullparser


    【解决方案1】:

    您得到的错误与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();
    }
    

    【讨论】:

    • 谢谢!这允许解析器遍历整个文档;但是,没有找到任何值?你知道这是为什么吗?
    • 嗯...从我从您的评论中得到的信息,您还没有完全理解XmlPullParser,您可以查看文档:developer.android.com/reference/org/xmlpull/v1/… getText() 方法只有在eventTypeTEXT 并且它有一些东西要返回时才会返回一些东西
    • 我不确定我是否理解我所缺少的。示例 XML 读取:<name>Location Name</name> 如果 getName() 返回 'name' ,.getText() 不应该返回 'Location Name' 吗?
    • 查看编辑后的答案,试试看,根据文档你应该得到标签的内容
    • 好的!我现在明白了! eventType 的 start_tag 和 text 是分开的。谢谢你。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多