在C#中遍历指定XML并映射数据到Result列表的方法
解决方案
你的代码存在几个问题:
- 遍历的是
RESPONSE元素本身,而非它下面的QUERY*子元素 RESPONSE元素没有searched属性,该属性属于每个QUERY1/QUERY2这类子元素QUERY?无法匹配所有以QUERY开头的元素
正确的做法是遍历RESPONSE下所有以QUERY开头的子元素,逐个提取属性和文本值:
方式一:使用foreach循环
List<Result> r = new List<Result>(); XDocument doc = XDocument.Parse(xmlResult); // 筛选RESPONSE元素下所有名称以QUERY开头的子元素 var queryElements = doc.Descendants("RESPONSE") .Elements() .Where(e => e.Name.LocalName.StartsWith("QUERY")); foreach (var queryItem in queryElements) { r.Add(new Result { // 用?.Value避免空引用异常,缺失则设为空字符串 SearchValue = queryItem.Attribute("searched")?.Value ?? string.Empty, SearchResult = queryItem.Value ?? string.Empty }); }
方式二:使用LINQ查询直接生成列表(更简洁)
XDocument doc = XDocument.Parse(xmlResult); List<Result> r = doc.Descendants("RESPONSE") .Elements() .Where(e => e.Name.LocalName.StartsWith("QUERY")) .Select(e => new Result { SearchValue = e.Attribute("searched")?.Value ?? string.Empty, SearchResult = e.Value ?? string.Empty }) .ToList();
补充说明
如果需要严格匹配QUERY后跟数字的元素(排除QUERYTEST这类不符合格式的),可以用正则表达式过滤:
.Where(e => Regex.IsMatch(e.Name.LocalName, @"^QUERY\d+$"))
使用前需引用System.Text.RegularExpressions命名空间。
内容的提问来源于stack exchange,提问作者Tayfun Yuksel
相关产品推荐
相关产品推荐

