Загрузка xml из файла

#c# #xml

#c# #xml

Вопрос:

Много искал ответы на мою проблему. Я нашел отличный способ преобразовать свой список в XML-файл, но я также хочу вернуть его обратно в список.

Мой текущий XML-файл выглядит следующим образом:

 <Commands>
    <Command command="!command1" response="response1" author="niccon500" count="1237"/>
    <Command command="!command2" response="response2" author="niccon500" count="1337"/>
    <Command command="!command3" response="response3" author="niccon500" count="1437"/>
</Commands>
 

Генерируется с помощью:

 var xml = new XElement("Commands", commands.Select(x =>
                      new XElement("Command",
                      new XAttribute("command", x.command),
                      new XAttribute("response", x.response),
                      new XAttribute("author", x.author),
                      new XAttribute("count", x.count))));
            File.WriteAllText(file_path, xml.ToString());
 

Итак, как мне получить информацию обратно из XML-файла?

Ответ №1:

Вы можете использовать следующий фрагмент кода:

 XDocument doc = XDocument.Load(@"myfile.xml");
 

чтобы загрузить XML-файл в XDocument объект.

Затем вы можете использовать .Descendants("Commands").Elements() для доступа ко всем элементам, содержащимся внутри <Commands> элемента, и добавлять их в список:

  List<Command> lstCommands = new List<Command>();
 foreach(XElement elm in doc.Descendants("Commands").Elements())
 {               
     lstCommands.Add(new Command
                     {
                        command = elm.Attribute("command").Value,
                        response = elm.Attribute("response").Value,
                        author = elm.Attribute("author").Value,
                        count = int.Parse(elm.Attribute("count").Value)
                     });
 }
 

Ответ №2:

При использовании xml для постоянного хранения начните с определения классов POC и украсьте их соответствующими атрибутами, такими как

 [XmlType("Command")]
public class CommandXml
{
    [XmlAttribute("command")]
    public string Command { get; set; }
    [XmlAttribute("response")]
    public string Response { get; set; }
    [XmlAttribute("author")]
    public string Author { get; set; }
    [XmlAttribute("count")]
    public int Count { get; set; }
}

[XmlRoot("Commands")]
public class CommandListXml : List<CommandXml>
{
}
 

А затем десериализация проста как:

 var txt = @"<Commands>
    <Command command=""!command1"" response=""response1"" author=""niccon500"" count=""1237""/>
    <Command command=""!command2"" response=""response2"" author=""niccon500"" count=""1337""/>
    <Command command=""!command3"" response=""response3"" author=""niccon500"" count=""1437""/>
</Commands>";
CommandListXml commands;
using (var reader = new StringReader(txt))
{
    var serializer = new XmlSerializer(typeof(CommandListXml));
    commands = (CommandListXml)serializer.Deserialize(reader);
} 
 

Ответ №3:

Вы можете использовать метод XDocument.Load для загрузки документа, а затем создать список команд, используя синтаксис LINQ to XML :

 XDocument doc = XDocument.Load(file_path);
var commands = doc.Root.Elements("Commands").Select(e => 
                      new Command()
                      {
                        command = e.Attribute("command").Value, 
                        response = e.Attribute("response").Value,
                        author = e.Attribute("author").Value, 
                        count= int.Parse(e.Attribute("count").Value) 
                      }).ToList();