将API返回XML字符串转InputStream解析时触发XmlPullParserException
解决XmlPullParserException的问题
我来帮你排查这个解析异常的问题,先从几个关键的地方入手:
1. DOCTYPE声明触发的解析限制
你的XML响应里包含<!DOCTYPE response>声明,而XmlPullParser(尤其是Android平台的默认实现)默认会对DOCTYPE进行校验,一旦遇到未定义的DOCTYPE就会抛出XmlPullParserException。解决方法是初始化解析器时关闭DOCTYPE处理:
XmlPullParser parser = Xml.newPullParser(); // 禁用DOCTYPE解析校验,避免异常 parser.setFeature(XmlPullParser.FEATURE_PROCESS_DOCDECL, false); parser.setInput(stream, "UTF-8");
2. 编码转换的隐性问题
你将字符串转成InputStream的代码存在编码隐患:
InputStream stream = new ByteArrayInputStream(response.body().string().getBytes());
这里的getBytes()没有指定编码,会使用当前平台的默认编码(比如Windows下的GBK),但你的XML明确声明了encoding='UTF-8',编码不一致会导致解析时出现乱码或异常。必须指定UTF-8编码:
// Java 7+ 推荐用StandardCharsets InputStream stream = new ByteArrayInputStream(response.body().string().getBytes(StandardCharsets.UTF_8)); // Android环境也可以这样写(注意捕获UnsupportedEncodingException) InputStream stream = new ByteArrayInputStream(response.body().string().getBytes("UTF-8"));
3. 完整的修复后解析示例
给你一个整合了上述修复的parseXml方法示例:
public void parseXml(InputStream stream) throws XmlPullParserException, IOException { XmlPullParser parser = Xml.newPullParser(); // 关闭DOCTYPE处理 parser.setFeature(XmlPullParser.FEATURE_PROCESS_DOCDECL, false); // 明确指定UTF-8编码,和XML声明一致 parser.setInput(stream, "UTF-8"); int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { String tagName = parser.getName(); switch (eventType) { case XmlPullParser.START_TAG: if ("errorcode".equals(tagName)) { String errorCode = parser.nextText(); System.out.println("错误码: " + errorCode); } else if ("value".equals(tagName)) { String value = parser.nextText(); System.out.println("结果值: " + value); } break; // 其他事件类型可按需扩展处理 } eventType = parser.next(); } }
验证步骤
- 先修复编码转换代码,确保InputStream是UTF-8编码格式
- 添加禁用DOCTYPE处理的配置
- 运行解析逻辑,就能正常解析目标XML响应了
内容的提问来源于stack exchange,提问作者Orbit
相关产品推荐
相关产品推荐

