C#如何获取数量未知的disp属性列表?
问题:解析XML响应并输出所有disp开头的属性
场景说明
发送请求后收到的XML响应示例:
<?xml version="1.0" encoding="UTF-8"?> <response result="0"> <check result="0"> <extras PRV_TXN_ID="538659" disp1="text1" disp2="text2" disp3="text3"/> </check> </response>
需求
需要在控制台输出所有以disp开头的属性(属性数量不固定,可能是disp1到disp8中的任意组合,数量未知)。
现有请求与解析代码
public static XmlDocument postXMLData(string xml) { var request = (HttpWebRequest)WebRequest.Create(Requests.url); byte[] bytes; bytes = System.Text.Encoding.ASCII.GetBytes(xml); request.ContentType = "text/xml; encoding='utf-8'"; request.ContentLength = bytes.Length; request.Method = "POST"; Stream requestStream = request.GetRequestStream(); requestStream.Write(bytes, 0, bytes.Length); requestStream.Close(); HttpWebResponse response; response = (HttpWebResponse)request.GetResponse(); if (response.StatusCode == HttpStatusCode.OK) { using (var streamReader = new StreamReader(response.GetResponseStream())) { var responseText = streamReader.ReadToEnd(); var result = new XmlDocument(); result.LoadXml(responseText); return result; } } throw new Exception("что то не так"); }
解决方案
直接在原方法中添加解析disp属性的逻辑,在返回XmlDocument前完成控制台输出:
修改后的代码
public static XmlDocument postXMLData(string xml) { var request = (HttpWebRequest)WebRequest.Create(Requests.url); byte[] bytes; bytes = System.Text.Encoding.ASCII.GetBytes(xml); request.ContentType = "text/xml; encoding='utf-8'"; request.ContentLength = bytes.Length; request.Method = "POST"; Stream requestStream = request.GetRequestStream(); requestStream.Write(bytes, 0, bytes.Length); requestStream.Close(); HttpWebResponse response; response = (HttpWebResponse)request.GetResponse(); if (response.StatusCode == HttpStatusCode.OK) { using (var streamReader = new StreamReader(response.GetResponseStream())) { var responseText = streamReader.ReadToEnd(); var result = new XmlDocument(); result.LoadXml(responseText); // 定位extras节点并筛选disp开头的属性 XmlNode extrasNode = result.SelectSingleNode("//extras"); if (extrasNode != null && extrasNode.Attributes != null) { foreach (XmlAttribute attr in extrasNode.Attributes) { if (attr.Name.StartsWith("disp", StringComparison.OrdinalIgnoreCase)) { Console.WriteLine($"{attr.Name}: {attr.Value}"); } } } return result; } } throw new Exception("что то не так"); }
代码说明
- 用
SelectSingleNode("//extras")在整个XML文档中定位<extras>节点; - 遍历该节点的所有属性,通过
StartsWith("disp")筛选目标属性,StringComparison.OrdinalIgnoreCase保证大小写不敏感匹配(不需要可去掉); - 直接在控制台输出属性名和对应的值。
如果想把属性解析逻辑单独封装,可提取为辅助方法:
private static void PrintDispAttributes(XmlDocument xmlDoc) { XmlNode extrasNode = xmlDoc.SelectSingleNode("//extras"); if (extrasNode?.Attributes == null) return; foreach (XmlAttribute attr in extrasNode.Attributes) { if (attr.Name.StartsWith("disp")) { Console.WriteLine($"{attr.Name}: {attr.Value}"); } } }
随后在原方法中调用PrintDispAttributes(result);即可。
内容的提问来源于stack exchange,提问作者John Paul Johns
相关产品推荐
相关产品推荐

