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)