从API返回的XML提取含PAN的信用卡数据失败,寻求解决方案
提取XML中PAN相关信用卡数据的解决方案
问题背景
从API获取的信用卡信息XML数据如下:
<?xml version="1.0" encoding="ISO-8859-9"?> <CC5Response> <ProcReturnCode>00</ProcReturnCode> <Response>Approved</Response> <Extra> <PAN1LABEL>PRICE</PAN1LABEL> <PAN2INDEXORDER>1</PAN2INDEXORDER> <PAN2STATUS>NO</PAN2STATUS> <SAFEKEYLASTMODIFIED>11/22/333</SAFEKEYLASTMODIFIED> <PAN2INDEXACCOUNTCLOSURE>00</PAN2INDEXACCOUNTCLOSURE> <PAN1STATUS>NO</PAN1STATUS> <PAN1INDEXACCOUNTCLOSURE>00</PAN1INDEXACCOUNTCLOSURE> <PAN2EXPIRY>00.1111</PAN2EXPIRY> <PAN1OWNER>JOHN DAVIS</PAN1OWNER> <PAN2LABEL>PRODUCT BUY</PAN2LABEL> <PAN2DESCRIPTION>DESCRIPION</PAN2DESCRIPTION> <PAN1>1111 22** **** 3333</PAN1> <PAN2>1111 22** **** 3333</PAN2> <PAN2OWNER>JOHN DAVIS</PAN2OWNER> <PAN1EXPIRY>02.2025</PAN1EXPIRY> <NUMBEROFPANS>3</NUMBEROFPANS> <PAN1INDEXORDER>1</PAN1INDEXORDER> <PAN1DESCRIPTION>PRODUCT NO</PAN1DESCRIPTION> </Extra> </CC5Response>
需要提取所有名称包含PAN的节点数据用于展示,但之前的两段C#代码均未成功:
第一段失败代码
List<string> list = new List<string>(); list.add(responseFromServer); //"responseFromServer" data from api string[] getPanArray = list.ToArray(); List<string> panlist = new List<string>(); string pan = "PAN"; foreach (var item in getPanArray) { if (item.Contains(pan)) { panlist.Add(item); } }
第二段失败代码
List<string> list = new List<string>(); list.Add(responseFromServer); String[] test = list.ToArray(); String text = "PAN"; String[] result = test.Where(s => { Boolean isInThere = true; Char[] textArray = text.ToCharArray(); foreach (Char c in textArray) { if (!s.Contains(c)) isInThere = false; } return isInThere; }).ToArray();
代码失败原因
两段代码的核心问题都是把完整XML字符串当成单个元素处理:
- 第一段代码将整个XML加入列表,遍历仅判断整个字符串是否包含
PAN,最终只会把完整XML加入结果列表,无法提取单个PAN节点。 - 第二段代码逻辑错误,检查字符串是否包含
PAN的每个字符,同样因为整个XML满足条件,返回的还是完整XML,没有拆分节点。
正确解决方案
不要把XML当纯文本处理,使用C#内置的XML解析类(如XDocument)来解析结构,精准提取目标节点:
using System; using System.Collections.Generic; using System.Xml.Linq; // 假设responseFromServer是从API获取的XML字符串 string responseFromServer = "你的XML数据"; // 加载XML文档 XDocument xmlDoc = XDocument.Parse(responseFromServer); // 筛选所有名称包含"PAN"的元素 var panElements = xmlDoc.Descendants() .Where(element => element.Name.LocalName.Contains("PAN")); // 将结果整理为键值对(节点名称: 节点值) Dictionary<string, string> panCardData = new Dictionary<string, string>(); foreach (var element in panElements) { panCardData.Add(element.Name.LocalName, element.Value); } // 示例:遍历输出所有PAN相关数据 foreach (var kvp in panCardData) { Console.WriteLine($"{kvp.Key}: {kvp.Value}"); }
方案说明
- XML解析类:
XDocument能正确识别XML的层级结构,避免纯文本处理时的换行、空格等干扰问题。 - 节点筛选:
Descendants()遍历所有子节点,通过Where条件筛选名称包含PAN的元素。 - 结果整理:将节点名称和值存入字典,方便后续在页面上展示(可根据需求转换为自定义实体类)。
内容的提问来源于stack exchange,提问作者Anka
相关产品推荐
相关产品推荐

