当值已知时,如何从应用程序设置文件中读取密钥

本文关键字:设置 应用程序 文件 密钥 读取 | 更新日期: 2023-09-27 17:58:56

我正在使用C#在.NET Framework中开发一个应用程序,在我的应用程序中,我需要从XML文件中获取值。我编写了以下代码,通过在XML文件中搜索关键字来获得关键字提供时的值。

        XmlDocument appSettingsDoc = new XmlDocument();
        appSettingsDoc.Load(Assembly.GetExecutingAssembly().Location + ".config");
        XmlNode node = appSettingsDoc.SelectSingleNode("//appSettings");
        XmlElement value = (XmlElement)node.SelectSingleNode(string.Format("//add[@key='{0}']", key));
        return (value.GetAttribute("value"));

但是,当给定值时,我无法获得密钥名称,例如,如果文件包含

                    `<add key="keyname" value="keyvalue" />`

如果我提供"keyvalue",我想得到"keyname"。我知道我正在读取appconfig文件,还有其他方法(即使用configurationmanager),但我想使用XML读取它。请帮帮我。

谢谢,

Bibhu

当值已知时,如何从应用程序设置文件中读取密钥

这不起作用吗?

XmlDocument appSettingsDoc = new XmlDocument();
appSettingsDoc.Load(Assembly.GetExecutingAssembly().Location + ".config");
XmlNode node = appSettingsDoc.SelectSingleNode("//appSettings");
XmlElement value = (XmlElement)node.SelectSingleNode(string.Format("//add[@value='{0}']", value));
return (value.GetAttribute("key"));

请注意,此系统假定appSettings中的每个值都是唯一的,否则您将只获得具有指定值的第一个密钥。

顺便说一句,如果我实现了这一点,我只需要从ConfigurationManager.AppSettings字典中构建一个新的字典,使用值作为键,使用键作为值。当配置文件的appSettings部分已经为您解析到字典中时,通过XML接口读取它肯定是一种代码气味。

尝试使用此方法

   private static string readConfig(string value)
    {
        System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Windows.Forms.Application.ExecutablePath);
        System.Configuration.AppSettingsSection ass = config.AppSettings;
        foreach (System.Configuration.KeyValueConfigurationElement item in ass.Settings)
        {
            if (item.Value == value)
                return item.Key;
        }
        return null;
    }

要根据值查找键,您仍然可以使用ConfigurationManager类,看不出有任何理由用自己的代码替换它。

因此,示例代码为:

string myKey = ConfigurationManager.AppSettings.AllKeys.ToList().FirstOrDefault(key =>
{
    return ConfigurationManager.AppSettings[key] == "keyvalue";
});

而不是

<add key="keyname" value="keyvalue" />

使用

<add key="keyvalue" value="keyname" />

这就是它的本意。

使用XPath查询,现在没有时间模拟它。

尝试像这个一样使用Linq到XMl

XDocument loaded = XDocument.Load(@"XmlFile.xml");
var q = from c in loaded.Descendants("add")
        where (String)c.Attribute("value") == "value1"
        select c;
foreach(var item in q)
     Console.WriteLine(item.Attribute("key").Value);