<?xml version="1.0" encoding="UTF-8"?>
<settings>
<key name="setting_name">true</key>
</settings>
这是我拥有的xml文件(有多个键值对),我需要在C#变量“setting_name”中获取值“true”
private static bool setting_name = true;
这是我到目前为止所做的事情
var setting_name = doc.Descendants("key").Where(k => k.Attribute("name").Value. Equals("setting_name")).Select(e => e.Elements("key")).FirstOrDefault();
答案 0 :(得分:2)
如果您想要解析&#34; True&#34;,您可以使用此Linq 2 XML:
void Main()
{
var doc = XDocument.Parse("<?xml version=\"1.0\" encoding=\"UTF-8\"?><settings><key name=\"setting_name\">true</key></settings>");
string boolStr = doc.Root.Elements()
.Where(e => e.Name.LocalName == "key" && e.Attribute("name").Value == "setting_name" )
.Single().Value;
bool value = bool.Parse(boolStr);
}
答案 1 :(得分:1)
我建议你正确地反序列化你的班级
public class Key
{
[XmlText]
public bool Value { get; set; }
[XmlAttribute("name")]
public string Setting { get; set; }
}
[XmlRoot("settings")]
public class Settings
{
[XmlElement("key")]
public List<Key> Keys { get; set; }
public Settings()
{
Keys = new List<Key>();
}
}
public static void Main(string[] args)
{
var xml = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<settings>
<key name=""setting_name"">true</key>
</settings>";
var serializer = new XmlSerializer(typeof(Settings));
Settings result;
using (TextReader reader = new StringReader(xml))
{
result = (Settings)serializer.Deserialize(reader);
}
var res = result.Keys.First();
Console.WriteLine(string.Format("{0}, {1}", res.Setting, res.Value));
}
答案 2 :(得分:1)
另一种选择可以是使用XPath。见https://msdn.microsoft.com/en-us/library/ms256086(v=vs.110).aspx:
var xml = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<settings>
<key name = ""setting_name"">true</key>
</settings> ";
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
var keys = xmlDoc.SelectNodes("//settings/key[@name=\"setting_name\"]");
Console.WriteLine(keys[0].InnerText);
答案 3 :(得分:0)
尝试使用xml反序列化程序。最好以这种方式使用它。我不确定性能,你必须检查。但是如果明天,你的xml中有更新的内容,那么序列化的东西将更加可维护。就是我的感受。
使用System.Xml.Serialization
命名空间
类:
[XmlRoot(ElementName="key")]
public class Key {
[XmlAttribute(AttributeName="name")]
public string Name { get; set; }
[XmlText]
public string Text { get; set; }
}
[XmlRoot(ElementName="settings")]
public class Settings {
[XmlElement(ElementName="key")]
public Key Key { get; set; }
}
然后是这样的事情:
var path = "path to your xml";
var serializer = new XmlSerializer(typeof(Settings[]));
var reader = new StreamReader(path);
reader.ReadToEnd();
var settings = (Settings[])serializer.Deserialize(reader);
reader.Close();
return settings;
尝试检查一下是否有效。 注意:我还没有测试过这段代码。但你可以试试这个想法
答案 4 :(得分:-1)
我想出了一个简单的解决方案,使用&#34; Sanjid's&#34;和&#34; Phillip Ngan's&#34;回答,这对于我的项目来说非常合适,几乎没有键值对。希望这会帮助任何人看到这篇文章
<?xml version="1.0" encoding="UTF-8"?>
<settings>
<key name="setting_name">true</key>
</settings>
将此.xml键值对解析为bool的代码
var xmlDoc = new XmlDocument();
xmlDoc.Load("settings.xml"); //.xml file path
var setting_name = xmlDoc.SelectNodes("//settings/key[@name=\"setting_name\"]");
bool setting_name = bool.Parse(setting_name[0].InnerText);
答案 5 :(得分:-2)
如果您需要获得超过1对,我建议创建字典,然后执行搜索:
var xDoc = XDocument.Load(filePath);
var dict = xDoc.Root.Elements("key").ToDictionary(x => x.Attribute("name").Value, x => x.Value);
var setting_name = dict.TryGetValue("setting_name", out var setting_name_str)
? bool.TryParse(setting_name_str, out var setting_name_value) && setting_name_value
: false; //default value or exception