You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 17:47:27