2011-01-22 4 views
1

この従業員オブジェクトの情報をXMLファイルに書き込むことができます。このように見える。C#: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オブジェクトに解析したいのですが、最適な解決策は何ですか?

答えて

8

個人的に、私はXMLにLINQを使用したい:

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

注これは、現在の属性が存在することを任意の検証を行っていないこと。

Employee.FromXElementXElementから従業員を作成する方法の詳細を知っている静的メソッドになり
XDocument doc = XDocument.Load("employees.xml"); 
var employees = doc.Root.Elements("Employee") 
         .Select(Employee.FromXElement) 
         .ToList(); 

:あなたはより複雑検証と構築が必要な場合は、のようなものにクエリを変更することができます。その後、インスタンスメソッドをToXElementにして、逆の操作を実行することができます。私はこのパターンを以前に使っていて、それで大きな成功を収めました。

ですが、確かにXMLシリアル化を使用していますが、これは「カスタム」シリアル化よりも柔軟性が低く、生成できる出力と受け入れ可能な入力の点でそのタイプのデータセットを進化させます。 Darin氏が示しているように、それはあなたの快適で不変な現在のタイプのように、残りのデザインには適合しないかもしれないタイプに様々な要件を課しています。

一方、組み込みのXMLシリアル化は、参照整合性などの場合にうまく対処します。

3

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; } 
    } 
    
関連する問題