C#中完整转换EventRecord XML为字典:解决Provider及TimeCreated属性值获取为空问题
解决XML转字典时无法获取元素属性的问题
看起来你踩了XML解析里一个常见的坑——只关注元素的文本值,却忽略了属性里的关键信息!你的现有代码只遍历了没有子元素的节点,并且只提取了元素的Value,但像Provider的Name、TimeCreated的SystemTime这类核心数据都存在元素属性里,自然拿不到。
修改后的完整代码
var xmlFile = File.ReadAllText(log); XDocument doc = XDocument.Parse(xmlFile); Dictionary<string, string> dataDictionary = new Dictionary<string, string>(); // 遍历XML中所有元素,不再局限于无子元素的节点 foreach (XElement element in doc.Descendants()) { // 优先处理元素的所有属性 foreach (XAttribute attr in element.Attributes()) { // 生成带元素名的属性键,比如Provider_Name,避免键冲突 string keyName = $"{element.Name.LocalName}_{attr.Name.LocalName}"; int keyInt = 0; // 处理重复键的情况 while (dataDictionary.ContainsKey(keyName)) { keyName = $"{element.Name.LocalName}_{attr.Name.LocalName}_{keyInt++}"; } dataDictionary.Add(keyName, attr.Value); } // 只在元素有非空文本时,才添加文本值到字典 if (!string.IsNullOrWhiteSpace(element.Value.Trim())) { string keyName = element.Name.LocalName; int keyInt = 0; while (dataDictionary.ContainsKey(keyName)) { keyName = $"{element.Name.LocalName}_{keyInt++}"; } dataDictionary.Add(keyName, element.Value.Trim()); } }
关键改进点
- 不再过滤有子元素的节点:这样能覆盖
Provider、TimeCreated这类本身没有子元素但带属性的节点,也能处理其他有子元素但自身带属性的节点。 - 单独处理元素属性:为属性生成带元素前缀的键(比如
Provider_Name),既清晰区分属性所属元素,也避免和其他节点的键重复。 - 优化文本值处理:只添加非空且去空格后的文本值,避免字典里出现无效的空值条目。
用这段代码处理你的XML,就能成功获取到LMS和2021-05-30T14:05:07.077547800Z这些属性值了。
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

