2010-08-30 133 views
1

我有以下結構在C#添加值以嵌套字典

<Root> 
    <Child Name="First"> 
     <Data Name="a" val="0"/> 
     <Data Name="b" val="1"/> 
     <Data Name="c" val="20"/> 
     <Data Name="d" val="10"/> 
     <Data Name="e" val="2"/> 
     <Data Name="f" val="0"/> 
     <Data Name="g" val="0"/> 
     <Data Name="h" val="0"/> 
    </Child> 
    <Child Name="Second"> 
     <Data Name="a" val="0"/> 
     <Data Name="b" val="0"/> 
     <Data Name="c" val="0"/> 
     <Data Name="d" val="0"/> 
     <Data Name="e" val="0"/> 
     <Data Name="f" val="0"/> 
     <Data Name="g" val="50"/> 
     <Data Name="h" val="30"/> 
    </Child> 
</Root> 

的XML文件,並像

 Dictionary<String, Dictionary<String, String>> Dict = new Dictionary<string, Dictionary<string, string>>(); 

我需要從XML文件添加數據到dictonary字典像

 First b 1 
       c 20 
       d 10 
       e 2 

     second g 50 
       h 30 

我需要添加僅將數據元素,其「VAL」屬性值不等於零

現在我使用嵌套for循環來做到這一點。

有沒有辦法做到這一點使用XML來LINQ

回答

2

這是一個有點長,不過......你能做些什麼?

XElement root = XElement.Parse(xml); 

var dict = root.Elements("Child") 
    .ToDictionary(
     child => child.Attribute("Name").Value, 
     child => child.Elements("Data") 
      .Where(data => data.Attribute("val").Value != "0") 
      .ToDictionary(
       data => data.Attribute("Name").Value, 
       data => data.Attribute("val").Value 
      ) 
    ); 
+0

你應該使用元素,而不是後人,因爲你知道「孩子」元素是根的直接子代。 – 2010-08-30 09:45:32

+0

@Thomas:聽起來不錯。 (我其實不太瞭解LINQ to XML;我只是想我可以看到如何用一般的LINQ解決這個問題,所以我提供了一個答案。) – 2010-08-30 09:50:11

1

下面是做這件事的方式:

string path = @"E:\tmp\test.xml"; 
var doc = XDocument.Load(path); 
var query = 
    from child in doc.Root.Elements("Child") 
    select new 
    { 
     Name = child.Attribute("Name").Value, 
     Data = child.Elements("Data") 
        .Where(data => data.Attribute("val").Value != "0") 
        .ToDictionary(
         data => data.Attribute("Name").Value, 
         data => data.Attribute("val").Value) 
    }; 
var dict = query.ToDictionary(child => child.Name, child => child.Data); 

而這裏的另一個:

string path = @"E:\tmp\test.xml"; 
var doc = XDocument.Load(path); 
var query = 
    from child in doc.Root.Elements("Child") 
    from data in child.Elements("Data") 
    where data.Attribute("val").Value != "0" 
    group data by child.Attribute("Name").Value; 

var dict = q2.ToDictionary(
      g => g.Key, 
      g => g.ToDictionary(
        data => data.Attribute("Name").Value, 
        data => data.Attribute("val").Value)); 

挑選你喜歡哪個;)