如何将<key name =“somename”> value </key>解析为C#varaiables

时间:2018-03-20 07:02:00

标签: c# .net xml

<?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();

6 个答案:

答案 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