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

Android使用XmlPullParser解析VAST XML仅能获取首个Ad id问题求助

问题分析与修复方案

根因定位

你代码的核心问题出在readAd方法的循环逻辑上:
while (parser.next() != XmlPullParser.END_TAG)的判断逻辑是只要解析器碰到任意一个结束标签事件就直接退出循环,并不会校验这个结束标签是否是当前处理的Ad标签的结束标签。
实际运行时,解析到Ad内部第一个子标签AdSystem的结束标签时,循环就提前退出了,此时解析器还停留在第一个Ad标签的内部嵌套结构中,没有读到第一个Ad的结束标签,回到readFeed方法后自然无法匹配到后续的Ad标签。

修复方法

你已经实现了正确的skip方法,可以根据标签嵌套深度完整跳过整个标签的所有内容,直接复用它即可:

方案1:仅读取Ad的id属性

如果不需要解析Ad内部的内容,直接删除错误的readAd逻辑,用skip方法跳过整个Ad标签即可:

private fun readFeed(parser: XmlPullParser)  {
    parser.require(XmlPullParser.START_TAG, null, "VAST")
    while (parser.next() != XmlPullParser.END_TAG || parser.name != "VAST") {
        if (parser.eventType != XmlPullParser.START_TAG) {
            continue
        }
        if (parser.name == "Ad") {
            println("ad id    ---->".plus(parser.getAttributeValue(null,"id")))
            // 直接跳过整个Ad标签的内部内容
            skip(parser)
        } else {
            skip(parser)
        }
    }
}
// 可以删除原有的错误readAd方法

方案2:需要解析Ad内部内容

如果后续要读取InLine、AdSystem等子标签的内容,可以按如下方式完善解析逻辑:

private fun readFeed(parser: XmlPullParser)  {
    parser.require(XmlPullParser.START_TAG, null, "VAST")
    while (parser.next() != XmlPullParser.END_TAG || parser.name != "VAST") {
        if (parser.eventType != XmlPullParser.START_TAG) {
            continue
        }
        if (parser.name == "Ad") {
            readAd(parser)
        } else {
            skip(parser)
        }
    }
}

private fun readAd(parser: XmlPullParser) {
    parser.require(XmlPullParser.START_TAG, null, "Ad")
    val adId = parser.getAttributeValue(null,"id")
    var adSystem: String? = null
    while (parser.next() != XmlPullParser.END_TAG || parser.name != "Ad") {
        if (parser.eventType != XmlPullParser.START_TAG) {
            continue
        }
        when(parser.name) {
            "InLine" -> adSystem = readInLine(parser)
            else -> skip(parser)
        }
    }
    println("ad id: $adId, adSystem: $adSystem")
}

private fun readInLine(parser: XmlPullParser): String? {
    parser.require(XmlPullParser.START_TAG, null, "InLine")
    var adSystem: String? = null
    while (parser.next() != XmlPullParser.END_TAG || parser.name != "InLine") {
        if (parser.eventType != XmlPullParser.START_TAG) {
            continue
        }
        if (parser.name == "AdSystem") {
            adSystem = readText(parser)
        } else {
            skip(parser)
        }
    }
    return adSystem
}

private fun readText(parser: XmlPullParser): String {
    var result = ""
    if (parser.next() == XmlPullParser.TEXT) {
        result = parser.text
        parser.nextTag()
    }
    return result
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:15:04