You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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();
    }
}

验证步骤

  1. 先修复编码转换代码,确保InputStream是UTF-8编码格式
  2. 添加禁用DOCTYPE处理的配置
  3. 运行解析逻辑,就能正常解析目标XML响应了

内容的提问来源于stack exchange,提问作者Orbit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:21:54