当值已知时,如何从应用程序设置文件中读取密钥
本文关键字:设置 应用程序 文件 密钥 读取 | 更新日期: 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);