如何将XML中的<key>键值对解析到C#变量?现有代码咨询
正确解析XML键值对到C#私有静态变量
嘿,我来帮你搞定这个XML解析的问题!你的现有代码里有个小问题——你在Select里尝试获取<key>节点的子<key>元素,但实际上目标节点的内容就是文本值(true),不是子元素。咱们一步步来修正:
首先,分析现有代码的问题
你的代码里这部分逻辑是错误的:
.Select(e => e.Elements("key"))
这里的e就是你找到的<key name="setting_name">true</key>节点,它没有子<key>元素,所以这个Select会返回空集合,最终setting_name拿到的是null,完全不是你想要的布尔值。
正确实现方式
假设你已经用XDocument加载了XML文件(记得先引用System.Xml.Linq命名空间),我们可以这样做:
步骤1:安全查询目标节点的文本值
// 加载XML文档 XDocument doc = XDocument.Load("你的XML文件路径"); // 查询对应key节点,获取文本值(用空传播运算符避免空引用异常) string settingValue = doc.Descendants("key") .FirstOrDefault(k => k.Attribute("name")?.Value == "setting_name")? .Value;
步骤2:转换为布尔值并赋值给私有静态变量
为了避免转换失败抛出异常,我们用bool.TryParse做安全转换,还可以自定义默认值:
private static bool setting_name = bool.TryParse(settingValue, out bool result) ? result : false; // 如果解析失败,默认设为false,可根据你的需求调整
更简洁的合并写法
你也可以把查询和转换合并成一行代码,让逻辑更紧凑:
private static bool setting_name = doc.Descendants("key") .Where(k => k.Attribute("name")?.Value == "setting_name") .Select(k => bool.TryParse(k.Value, out bool parsedValue) ? parsedValue : false) .FirstOrDefault();
额外提示
- 用
?.(空传播运算符)可以避免当找不到目标节点或name属性时抛出NullReferenceException bool.TryParse比直接bool.Parse更安全,因为如果XML里的值不是有效的布尔字符串(比如拼写错误的tru),程序不会崩溃,而是返回你设置的默认值- 如果你的XML里有多个相同
name的key节点,FirstOrDefault会取第一个;如果要求必须只有一个对应节点,可以换成SingleOrDefault,这样当存在多个时会抛出异常,方便排查问题
内容的提问来源于stack exchange,提问作者oneGAWDabv
相关产品推荐
相关产品推荐

