尝试将XML解析为String时出现XmlPullParserException

时间:2018-04-03 19:03:15

标签: java android xml xml-parsing inputstream

API返回包含以下内容的String响应:

<?xml version='1.0' encoding='UTF-8'?>                                                                             
<!DOCTYPE response>                                                                              
<response version='1.0'>                                                    
    <errorcode>0</errorcode>                                                                                    
    <result>
        <value>123</value>
    </result>                                                                         
</response>

此响应变为InputStream,并传递给parseXml()方法:

InputStream stream = new ByteArrayInputStream(response.body().string().getBytes());
parseXml(stream);

以下是parseXml()方法的正文:

public Map parseXml(InputStream in) throws XmlPullParserException, IOException {

    try {
        XmlPullParser parser = Xml.newPullParser();
        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
        parser.setFeature(XmlPullParser.FEATURE_PROCESS_DOCDECL, false);
        parser.setInput(in, null);
        parser.nextTag();
        return readResponse(parser);
    } finally {
        in.close();
    }
}

执行此代码时,会产生以下错误并指向包含parser.nextTag()的行:

  

org.xmlpull.v1.XmlPullParserException:意外类型(位置:在java.io.InputStreamReader中END_DOCUMENT null @ 1:1)

这里发生了什么?我怀疑XML中的<!DOCTYPE>行可能已经解析了解析器,但设置parser.setFeature(XmlPullParser.FEATURE_PROCESS_DOCDECL, false);似乎无法解决问题。导致此错误的原因是什么,以及如何解决?

以下是评论中建议的更改:

ByteArrayInputStream替换为StringReader

StringReader reader = new StringReader(response.body().string());
parseXml(reader);

然后

public Map parseXml(StringReader in) throws XmlPullParserException, IOException {

    try {
        XmlPullParser parser = Xml.newPullParser();
        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
        parser.setFeature(XmlPullParser.FEATURE_PROCESS_DOCDECL, false);
        parser.setInput(in);
        parser.nextTag();
        return readResponse(parser);
    } finally {
        in.close();
    }
}

这些更改产生了类似的错误:

  

org.xmlpull.v1.XmlPullParserException:意外类型(位置:在java.io.StringReader中END_DOCUMENT null @ 1:1)

0 个答案:

没有答案