2012-02-08 24 views
2

私は階層的なXMLデータusinq LINQからC#オブジェクトを構築したいと思います。 XMLをXDocumentとしてロードしました(ファイルからXMLを最初に文字列に読み込むことによって)。 私はこれをどのように解析するべきかについていくつかのガイダンスが必要です。LINQを使用して、階層型XMLをPOCOにロードするにはどうすればよいですか?

例文字列は

<?xml version="1.0" encoding="utf-8" ?> 
<categories version="1.0"> 
    <category id="0" name="women" description="test"> 
    <category id="01" name="tops" description="test"></category> 
    <category id="02" name="bottoms" description="test"></category> 
    <category id="03" name="accessories" description="test"></category> 
    </category> 
    <category id="1" name="men" description="test"> 
    <category id="11" name="shirts" description="test"></category> 
    <category id="12" name="trousers" description="test"></category> 
    <category id="13" name="accessories" description="test"></category> 
    </category> 
    <category id="2" name="kids &amp; baby" description="test" /> 
    <category id="3" name="home &amp; living" description="test" /> 
</categories> 

としてXMLファイルから読み込まれ、私はそのようなPOCOクラスを持っている:

[DataContract] 
public class Category 
{ 
    [DataMember] 
    public int Id { get; set; } 

    [DataMember] 
    public string Name { get; set; } 

    [DataMember] 
    public string Description { get; set; } 

    [DataMember] 
    public List<Category> SubCategories { get; set; } 
} 

答えて

5

あなたは2つのオプションがあります。

  1. 使用.NETのシリアル化は、その場合には、適切な属性(プロパティ名⇄ XML要素名)を使用してPOCOクラスを飾ることにより、XMLマッピングを指定する必要があります。

  2. LINQ to XMLを使用します(必要なように)。その場合、コードは次のようになります:

    var categories = x.Root.Elements().Select(e => 
        new Category 
        { 
         Id = int.Parse(e.Attribute("id").Value), 
         Name = e.Attribute("name").Value, 
         Description = e.Attribute("description").Value, 
         SubCategories = e.Elements().Select(e1 => 
          new Category 
          { 
           Id = int.Parse(e1.Attribute("id").Value), 
           Name = e1.Attribute("name").Value, 
           Description = e1.Attribute("description").Value 
          }).ToList() 
        }).ToList(); 
    

    または再帰的に、あなたのクラスに再帰的なメソッドParseを追加することによって:

    public static Category Parse(XElement value) 
    { 
        return new Category 
        { 
         Id = int.Parse(value.Attribute("id").Value), 
         Name = value.Attribute("name").Value, 
         Description = value.Attribute("description").Value, 
         SubCategories = value.Elements().Select(newvalue => Parse(newvalue)).ToList() 
        }; 
    } 
    

    とこのようにそれを呼び出す:

    var categories = x.Root.Elements().Select(e => Category.Parse(e)).ToList(); 
    
+0

2つ以上のレベルのカテゴリがある場合、コードは機能しません。 – svick

+0

オーリンありがとうございます。 –

+1

私の答えはsvick – Orlin

関連する問題