Android应用中解析Aadhaar二维码返回的XML数据遇阻,求助
解决Aadhaar二维码转义XML解析问题
我明白你现在的困扰——扫描Aadhaar二维码得到的是经过HTML转义的XML字符串,直接丢给解析器肯定会报错。核心问题是先把转义字符还原成标准XML格式,再进行解析。下面是具体的解决步骤:
第一步:还原转义的XML字符串
你拿到的字符串里,<是<的转义,>是>的转义,还有\"是双引号的转义。我们需要把这些转义字符还原成原始的XML符号,有两种可靠的方式:
方式一:直接字符串替换(简单直接)
适合确定只有这几种转义字符的场景:
String escapedXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <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\"/>"; // 逐个替换转义字符 String unescapedXml = escapedXml .replace("<", "<") .replace(">", ">") .replace("\\\"", "\"");
方式二:使用Android的Html工具类(更通用)
如果字符串里可能有其他HTML转义字符,推荐用系统API处理,注意区分Android版本:
String escapedXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <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\"/>"; 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解析器会把<当成普通文本内容,而不是XML标签的开始,自然无法识别节点结构,导致解析失败。
内容的提问来源于stack exchange,提问作者Vignes
相关产品推荐
相关产品推荐

