【问题标题】:C# : The best solution to parse the xml file?C#:解析 xml 文件的最佳解决方案?
【发布时间】:2011-01-22 08:36:58
【问题描述】:

我可以将这个员工对象的信息写入 XML 文件。看起来像这样。

员工班级

class Employee
    {
        int _id;
        string _firstName;
        string _lastName;
        int _salary;
        string _text;
        public Employee(int id, string firstName, string lastName, int salary,string text)
        {
            this._id = id;
            this._firstName = firstName;
            this._lastName = lastName;
            this._salary = salary;
            this._text = text;
        }
        public int Id { get { return _id; } }
        public string FirstName { get { return _firstName; } }
        public string LastName { get { return _lastName; } }
        public int Salary { get { return _salary; } }
        public string Text { get { return _text; } }
    }

写入 Xml。

<Employees>
    <Employee Text="text1">
        <ID>1</ID>
        <FirstName>David</FirstName>
        <LastName>Smith</LastName>
        <Salary>10000</Salary>
    </Employee>
    <Employee Text="text2">
           <ID>3</ID>
           <FirstName>Mark</FirstName>
           <LastName>Drinkwater</LastName>
           <Salary>30000</Salary>
    </Employee>
<Employees>

然后我想将xml解析回Employee对象,最好的解决方案是什么?

【问题讨论】:

    标签: c# xml xml-parsing


    【解决方案1】:

    就个人而言,我会使用 LINQ to XML:

    XDocument doc = XDocument.Load("employees.xml");
    var employees = doc.Root.Elements("Employee")
                            .Select(e => new Employee(
                                           (int) e.Attribute("ID"),
                                           (string) e.Attribute("FirstName"),
                                           (string) e.Attribute("LastName"),
                                           (int) e.Attribute("Salary"))
                            .ToList();
    

    请注意,这当前没有执行任何属性存在的验证。如果您需要更复杂的验证和构造,可以将查询更改为:

    XDocument doc = XDocument.Load("employees.xml");
    var employees = doc.Root.Elements("Employee")
                            .Select(Employee.FromXElement)
                            .ToList();
    

    其中Employee.FromXElement 将是一个静态方法,它知道如何从XElement 创建员工的详细信息。然后,您可能需要ToXElementinstance 方法来执行反向操作。我以前使用过这种模式并取得了巨大的成功。

    虽然您可以当然使用 XML 序列化,但我发现这往往不如“自定义”序列化灵活,就它可以产生的输出、它可以接受的输入以及允许你以应对类型中不断变化的数据集。正如 Darin 所展示的,它还对可能不适合您设计的其余部分的类型提出了各种要求 - 例如您令人愉快的不可变当前类型。

    另一方面,内置的 XML 序列化将更好地处理参照完整性等问题。

    【讨论】:

      【解决方案2】:

      你可以使用XmlSerializer

      var root = new XmlRootAttribute
      {
          ElementName = "Employees"
      };
      var serializer = new XmlSerializer(typeof(Employee[]), root);
      using (var reader = XmlReader.Create("employees.xml"))
      {
          var employees = (Employee[])serializer.Deserialize(reader);
      }
      

      您的 Employee 类需要稍作修改才能使其工作:

      1. 需要公开
      2. 需要有默认构造函数
      3. 属性需要有设置器

        public class Employee
        {
            public int Id { get; set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public int Salary { get; set; }
        }
        

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-12
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        • 2010-10-16
        相关资源
        最近更新 更多