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

Android Studio中使用Jsoup解析XML数据运行异常如何解决?

问题排查与正确实现

原代码核心错误点

  • 误用Jsoup.parse(String)重载:该方法会直接将传入的URL字符串当作待解析的文本内容,不会发起网络请求拉取远程XML数据
  • 未指定XML解析模式:Jsoup默认使用HTML解析器,对XML的大小写敏感、自定义标签兼容差,解析XML需要指定XmlParser
  • 冗余的HTML选择器:目标接口返回纯XML结构,不存在ul.list > li这类HTML标签,相关逻辑无意义

正确实现代码

如果是Android平台运行,需要先在AndroidManifest.xml添加网络权限:<uses-permission android:name="android.permission.INTERNET" />

import org.jsoup.parser.XmlParser

private fun xmlParse_Jsoup() {
    thread {
        try {
            // 1. 发起网络请求拉取XML内容,指定使用XML解析器
            val doc = Jsoup.connect("http://xmlweather.vedur.is/?op_w=xml&type=forec&lang=is&view=xml&ids=1;422")
                .parser(XmlParser()) // 关键:指定XML解析模式
                .get()

            // 2. 获取所有forecast标签
            val forecastElements = doc.getElementsByTag("forecast")
            
            // 3. 遍历每个forecast标签,提取目标子标签内容
            for (forecast in forecastElements) {
                val ftime = forecast.getElementsByTag("ftime").text()
                val F = forecast.getElementsByTag("F").text()
                val D = forecast.getElementsByTag("D").text()
                val T = forecast.getElementsByTag("T").text()
                val W = forecast.getElementsByTag("W").text()
                
                // 输出结果,也可根据需求存入自定义集合
                println("""
                    预报时间:$ftime
                    风力:$F
                    风向:$D
                    温度:$T
                    天气代码:$W
                    ------------------------
                """.trimIndent())
            }
        } catch (e: Exception) {
            // 统一捕获网络异常、解析异常
            e.printStackTrace()
        }
    }
}

注意事项

  • 网络请求属于耗时操作,必须在子线程执行,原代码的thread包裹逻辑是正确的
  • XML解析模式下标签名大小写敏感,如果后续接口调整了标签大小写,需要对应修改getElementsByTag的入参

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:54:03