2013-02-26 58 views
0

XDocument的內容是下面的XML。XDocument到對象列表

我想獲得一個List(),請參閱此消息的結尾處。

<myXml> 
    <myDatas code="01"> 
    <myVar name="myvar" value="A" /> 
    <myData name="A" value="A1" /> 
    <myData name="B" value="B1" /> 
    </myDatas> 
    <myDatas code="02"> 
    <myVar name="myvar" value="B" /> 
    <myData name="A" value="A2" /> 
    <myData name="D" value="D2" /> 
    </myDatas> 
</myXml> 

public class MyData 
{ 
    public string MainCode { get; set; } 
    public string Code { get; set; } 
    public string Value { get; set; } 
} 

我想一個List()這個內容應該是這樣的:

new MyData { MainCode = "01"; Code = "A"; Value = "A1" }; 
new MyData { MainCode = "01"; Code = "B"; Value = "B1" }; 
new MyData { MainCode = "02"; Code = "A"; Value = "A2" }; 
new MyData { MainCode = "02"; Code = "D"; Value = "D2" }; 
+0

我的答案最終不適合你嗎? (我看到你不接受它。)請添加一個註釋,指出問題。 – 2013-02-27 07:02:52

+0

-1用於編輯問題。您提出了一個問題,您已經收到了有關該問題的正確答案。 – 2013-02-27 07:14:34

+1

@lazyberezovsky你是對的,我刪除了更新 – 2013-02-27 08:03:35

回答

5

肯定 - 所以你需要的東西是這樣的:

var query = from datas in doc.Root.Elements("myDatas") 
      let code = (string) datas.Attribute("code") 
      from data in datas.Elements("myData") 
      select new MyData { 
       MainCode = code, 
       Code = (string) data.Attribute("name"), 
       Value = (string) data.Attribute("value"), 
      }; 

var list = query.ToList(); 

注意多from條款以平坦的結果。

另一種選擇將是剛剛找到所有的「葉子」元素,並獲取代碼部分從父:

var query = from data in doc.Descendants("myData") 
      select new MyData { 
       MainCode = (string) data.Parent.Attribute("code"), 
       Code = (string) data.Attribute("name"), 
       Value = (string) data.Attribute("value"), 
      }; 

var list = query.ToList(); 

編輯:如果您的文檔使用名稱空間,這是太容易了:

XNamespace ns = "http://the-uri-of-the-namespace"; 
var query = from data in doc.Descendants(ns + "myData") 
      ... 

這使用XName operator +(XNamespace, string)重載操作符。

+0

你能檢查我的更新喬恩。對於示例,第一個XML代碼沒問題,但沒有更新中的代碼(od課程中,我修改了name屬性) – 2013-02-27 07:06:16

+0

@ Kris-I:你的文檔*實際上*是否有'myXml'根標籤或不?價值部分發生了什麼?你說第二個XML「不好」 - 會發生什麼? (你已經給出了兩個非常不同的文檔,有兩組不同的預期結果,我並不感到驚訝,我的原始答案沒有與第二個文檔一起工作......) – 2013-02-27 07:10:27

+0

你的代碼工作,但我得到一個異常在2情況:1.當myxml節點有一個名稱空間時2.當一個屬性值有一個「é」(數據是法語的)例外:給定編碼中的字符無效 – 2013-02-27 07:43:39