2012-06-04 69 views
1

我使用以下格式的xml節點。這個節點必須轉換成用戶定義類型,它是每個節點必須轉換成說MyClass的有效地使用Linq處理Xnode

class MyClass 
{ 
    public string tag1Id {get;set;} 
    public int tag3Val {get;set;} 
    public string tag3Id {get;set;} 
    public int tag5Val {get;set;} 
    public string tag5Id {get;set;} 
    public DataTime tag7Val {get;set;} 

} 

    <tag1 id="id1"> 
    <tag2> 
     <tag3 id="id3">10</tag3> 
     <tag4> 
     <tag5 id="id5">20</tag5> 
     </tag4> 
    </tag2> 
    <tag6> 
     <tag7>2010-12-31</tag7> 
    </tag6> 
    </tag1> 

我是新來的LINQ,它可以使用LINQ來完成的對象。要求是xmlseralization不應該使用:( 是否有通過此方案可以很容易地處理任何其他的方法呢?

+0

這個XML有什麼意義?名字很可怕。如果正在使用的xml不是來自遺留代碼,請更改它以使其具有意義,或者如果需要,將從現在開始調試/維護/理解幾年。 –

回答

0

不,不能這樣做。

必須有一個轉換的地方做,由於業務邏輯管道去從嚴格的節點ID /位置的具體屬性。

可以做的是編寫一個構造函數,該構造函數接受節點並相應地填充屬性。然後Linq可以用來枚舉節點和通過選擇創建類元素的新投影例如:

 string data = @" 
<tags> 
    <tag id=""id1""> 
    <tag2> 
     <tag3 id=""id3"">10</tag3> 
     <tag4> 
     <tag5 id=""id5"">20</tag5> 
     </tag4> 
    </tag2> 
    <tag6> 
     <tag7>2010-12-31</tag7> 
    </tag6> 
    </tag> 
</tags> 
    "; 
var xml = XDocument.Parse(data); 

    var classes = xml.Descendants("tag1") 
        .Select(nd => new MyClass(nd));