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
相关产品推荐
相关产品推荐

