C#:解析xml文件的最佳解决方案?

Pri*_*ief 1 c# xml xml-parsing

我可以将此员工对象的信息写入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; } }
    }
Run Code Online (Sandbox Code Playgroud)

写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>
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 7

就个人而言,我使用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();
Run Code Online (Sandbox Code Playgroud)

请注意,目前尚未执行属性存在的任何验证.如果您需要更复杂的验证和构造,可以将查询更改为:

XDocument doc = XDocument.Load("employees.xml");
var employees = doc.Root.Elements("Employee")
                        .Select(Employee.FromXElement)
                        .ToList();
Run Code Online (Sandbox Code Playgroud)

哪里Employee.FromXElement是一个静态方法,它知道如何从一个创建一个Employee的细节XElement.然后,您可能需要一个实例方法ToXElement来执行反向操作.我之前使用过这种模式,并且取得了很大的成功.

虽然你可以肯定使用XML序列化,我觉得这往往比"定制"系列化不够灵活,在输出它可以产生,输入可以接受的条款,让您应付不断变化的数据集合类型.正如Darin所示,它还对类型提出了各种要求,这些要求可能与您设计的其他部分不相符 - 例如您不可避免的不可变电流类型.

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