我正在使用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
答案 0 :(得分:1)
要根据值找到密钥,您仍然可以使用ConfigurationManager
类,看不出有任何理由用自己的代码替换它。
因此,示例代码为:
string myKey = ConfigurationManager.AppSettings.AllKeys.ToList().FirstOrDefault(key =>
{
return ConfigurationManager.AppSettings[key] == "keyvalue";
});
答案 1 :(得分:1)
这不起作用吗?
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字典构造一个新字典,使用值作为键和键作为值。当已经为你解析成字典时,通过XML接口读取配置文件的appSettings部分绝对是代码味道。
答案 2 :(得分:1)
尝试使用此方法
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;
}
答案 3 :(得分:0)
而不是
<add key="keyname" value="keyvalue" />
使用
<add key="keyvalue" value="keyname" />
这就是它的意义。
答案 4 :(得分:0)
使用XPath查询,没有时间模拟一个。
答案 5 :(得分:0)
尝试像这样使用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);