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

Android应用中解析Aadhaar二维码返回的XML数据遇阻,求助

解决Aadhaar二维码转义XML解析问题

我明白你现在的困扰——扫描Aadhaar二维码得到的是经过HTML转义的XML字符串,直接丢给解析器肯定会报错。核心问题是先把转义字符还原成标准XML格式,再进行解析。下面是具体的解决步骤:

第一步:还原转义的XML字符串

你拿到的字符串里,&lt;是<的转义,&gt;是>的转义,还有\"是双引号的转义。我们需要把这些转义字符还原成原始的XML符号,有两种可靠的方式:

方式一:直接字符串替换(简单直接)

适合确定只有这几种转义字符的场景:

String escapedXml = "&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt; &lt;PrintLetterBarcodeData uid=\"00X575452391\" name=\"XX\" gender=\"M\" yob=\"1992\" gname=\"XX\" co=\"S/O: XX\" house=\"4-175\" street=\"XX\" lm=\"XX\" vtc=\"XX\" po=\"XX\" dist=\"XX\" subdist=\"XX\" state=\"\" pc=\"XX\" dob=\"XX/XX/XXXX\"/&gt;";
// 逐个替换转义字符
String unescapedXml = escapedXml
        .replace("&lt;", "<")
        .replace("&gt;", ">")
        .replace("\\\"", "\"");

方式二:使用Android的Html工具类(更通用)

如果字符串里可能有其他HTML转义字符,推荐用系统API处理,注意区分Android版本:

String escapedXml = "&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt; &lt;PrintLetterBarcodeData uid=\"00X575452391\" name=\"XX\" gender=\"M\" yob=\"1992\" gname=\"XX\" co=\"S/O: XX\" house=\"4-175\" street=\"XX\" lm=\"XX\" vtc=\"XX\" po=\"XX\" dist=\"XX\" subdist=\"XX\" state=\"\" pc=\"XX\" dob=\"XX/XX/XXXX\"/&gt;";
String unescapedXml;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    unescapedXml = Html.fromHtml(escapedXml, Html.FROM_HTML_MODE_LEGACY).toString();
} else {
    unescapedXml = Html.fromHtml(escapedXml).toString();
}

第二步:解析还原后的XML

还原后的XML是一个单根节点PrintLetterBarcodeData,所有用户数据都以属性的形式存在,用Android常用的XmlPullParser就能轻松解析:

try {
    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
    factory.setNamespaceAware(true);
    XmlPullParser parser = factory.newPullParser();
    
    // 把还原后的XML字符串输入到解析器
    parser.setInput(new StringReader(unescapedXml));
    int eventType = parser.getEventType();
    
    while (eventType != XmlPullParser.END_DOCUMENT) {
        // 找到目标节点
        if (eventType == XmlPullParser.START_TAG && "PrintLetterBarcodeData".equals(parser.getName())) {
            // 逐个获取属性值
            String uid = parser.getAttributeValue(null, "uid");
            String name = parser.getAttributeValue(null, "name");
            String gender = parser.getAttributeValue(null, "gender");
            String yearOfBirth = parser.getAttributeValue(null, "yob");
            String dateOfBirth = parser.getAttributeValue(null, "dob");
            String address = parser.getAttributeValue(null, "house") + ", " 
                            + parser.getAttributeValue(null, "street") + ", "
                            + parser.getAttributeValue(null, "vtc") + ", "
                            + parser.getAttributeValue(null, "dist");
            
            // 这里可以把数据存入自定义对象,或者直接使用
            Log.d("AadhaarInfo", "UID: " + uid + ", Name: " + name + ", DOB: " + dateOfBirth);
        }
        eventType = parser.next();
    }
} catch (XmlPullParserException | IOException e) {
    e.printStackTrace();
    // 这里可以添加解析失败的错误处理逻辑
}

为什么之前解析失败?

你之前的尝试大概率是跳过了转义还原这一步——XML解析器会把&lt;当成普通文本内容,而不是XML标签的开始,自然无法识别节点结构,导致解析失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:24:11