【问题标题】:Deserialising XML to List将 XML 反序列化为列表
【发布时间】:2012-04-02 15:26:48
【问题描述】:

经过数小时尝试获取一个序列化为 XML 的列表并完成此操作(尽管我确信我做得非常糟糕)。我现在需要将 XML 反序列化回列表。这是我的初学者 XML 文件。

 <?xml version="1.0" encoding="utf-8"?>
<ArrayOfPrograms xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Programs>
    <File-name>chrome.exe</File-name>
    <File-path>C:\Users\Shane\AppData\Local\Google\Chrome\Application\chrome.exe</File-path>
  </Programs>
  <Programs>
    <File-name>lol.launcher.exe</File-name>
    <File-path>C:\Riot Games\League of Legends\lol.launcher.exe</File-path>
  </Programs>
</ArrayOfPrograms>

这是我正在使用的配置类;

  public class Config
{
    [XmlElement("Recipient")]
    public string recipient;
    [XmlElement("Username")]
    public string username;
    [XmlElement("Password")]
    public string password;
    [XmlElement("Serial-ID")]
    public string serialId;


[XmlElement("Email-settings")]

    public Email Emails { get; set; }

    [XmlArray("Program-List"), XmlArrayItem(typeof(Programs), ElementName = "Programs")]
    public List<Programs> Programs { get; set; }

    [XmlElement("Database-settings")]
    public Database Databases { get; set; }
}

 public class Programs
{
    public string filename;
    public string filepath;
    [XmlElement("File-name")]
    public string Filename { get; set; }
    [XmlElement("File-path")]
    public string Filepath { get; set; }

}

谁能告诉我应该走哪条路线?我从来没有处理过反序列化到列表中。

【问题讨论】:

    标签: c# .net xml list deserialization


    【解决方案1】:
    using (var f = File.Open("...", FileMode.Open))
    {
        XmlSerializer serializer = new XmlSerializer(typeof(List<Programs>));
        List<Programs> programs = (List<Programs>)serializer.Deserialize(f);
    }
    

    【讨论】:

      【解决方案2】:

      我用这个很棒的工具来处理 Visual Studio 附带的那种东西,叫做 XSD

      http://msdn.microsoft.com/en-us/library/x6c1kb0s(v=VS.80).aspx

      基本上你将它指向一个 XML 文件,然后它会构建你的 C# 文件。您将其导入到您的解决方案中,您可以像使用 XML 文件一样使用该对象,并简单地序列化或反序列化以在两者之间进行转换。

      编辑:

      要使用它,只需点击开始、程序、Visual Studio(2008 或 2010)、Visual Studio 工具,然后点击命令提示符。

      然后转到您的 XML 文件所在的文件夹和“XSD /l cs myFile.xml”的 C# 代码

      【讨论】:

      • 我以前看过这个 :) 谢谢你的建议,但因为我已经在手动方式序列化列表中苦苦挣扎了,为了我自己......出于好奇,我'也想尝试手动反向操作:P 我有时很疯狂。
      • 哦,不,我完全明白。第一次用艰难的方式做事总是好的,因此您会欣赏工具为您所做的事情(因此,当您没有工具时,您不会完全无助) Linq to XML 怎么样?这仍然比使用工具msdn.microsoft.com/en-us/library/bb387098.aspx
      • 从你说话的方式来看,我们是否在这里假设仅通过硬编码而不使用任何工具,将 XML 放入列表中将是一件很痛苦的事情? XD
      • 对我来说,一旦使用 XSD 就再也回不去了。我不会将 Linq to XML 称为工具。这绝对是你应该尝试的东西。它只是让您轻松查询 XML 文件中的节点。您可以做的其他事情就是在您的 XML 文件上运行 XSD 并查看它为它生成的 C# 代码。
      • 我以前也这样做过……但就像看着一堵文字墙,我不知道如何将自己的变量名放回其中等等……太可怕了。也许这就是我一开始没有使用它的原因..
      【解决方案3】:

      您可以使用 Linq to XML 并编写如下代码:

      public class MyProgram
      {
          public string FileName { get; set; }
          public string FilePath { get; set; }
      }
      
      // load data file
      using ( XmlTextReader xmlReader = new XmlTextReader("myfilename.xml") )
      {
          XDocument xdoc = XDocument.Load(xmlReader);
      
          var programs= from programItem in xdoc.Root.Elements()
                      select new MyProgram {
                          FileName = programItem.Element("File-name").Value,
                          FilePath = programItem.Element("File-path").Value
                      };
      
          List<MyProgram> result = programs.ToList();
      }
      

      【讨论】:

      • 我应该为此使用特定的命名空间吗?我以前从未使用过 LINQ,但例如 XmlTestReader 没有显示为有效选项。编辑,没关系,明白了:D system.xml.linq;
      • System.XML,你可能需要导入程序集
      • 命名空间是 System.Xml.Linq。 Linq to XML 非常易于使用,您可以在这里找到更多信息:msdn.microsoft.com/en-us/library/bb387098.aspx
      【解决方案4】:

      反序列化 xml 的最简单方法是使用 XML 架构定义工具 (Xsd.exe)

      xml schema definition tool

      【讨论】:

      • mm,我以前看过这个,但为了学习和想要这样做......也许更难的方式,我想尝试手动执行此操作。不过感谢您的建议:)
      猜你喜欢
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-21
      • 1970-01-01
      相关资源
      最近更新 更多