2011-07-08 41 views
2

我有xml文件更好的方式來讀取XML

<root> 
    <child_1> 
    <sub_child attr1="text" attr2="text" /> 
    <sub_child attr1="text" attr2="text" /> 
    <sub_child attr1="text" attr2="text" /> 
    </child_1>  
    <child_2> 
    <sub_child attr1="text" attr2="text" /> 
    <sub_child attr1="text" attr2="text" /> 
    <sub_child attr1="text" attr2="text" /> 
    </child_2>  
    <child_3> 
    <sub_child_1 attr1="text" attr2="text" /> 
    <sub_child_2 attr1="text" attr2="text" /> 
    </child_3>  
    ... 

,我想讀

class SubChild { 
    string a1; 
    string a2; 
} 

我需要child_1和child_2 SubChild對象的兩個列表和兩個SubChild對象sub_child屬性類對於sub_child_1和sub_child_2

現在我使用的LINQ to XML和我的代碼是

// List<SubChild> 
var child_1 = from s in doc.Descendants("sub_child").Where(x => x.Parent.Name == "child_1") 
       select new SubChild { 
       a1 = s.Attribute("attr1").Value, 
       a2 = s.Attribute("attr2").Value, 
       }; 

// List<SubChild> 
var child_2 = from s in doc.Descendants("sub_child").Where(x => x.Parent.Name == "child_2") 
       select new SubChild { 
       a1 = s.Attribute("attr1").Value, 
       a2 = s.Attribute("attr2").Value, 
       }; 

// SubChild 
var sub_1 = (from s in doc.Descendants("sub_child_1") 
       select new SubChild { 
       a1 = s.Attribute("attr1").Value, 
       a2 = s.Attribute("attr2").Value, 
       }).First(); 

// SubChild 
var sub_2 = (from s in doc.Descendants("sub_child_2") 
       select new SubChild { 
       a1 = s.Attribute("attr1").Value, 
       a2 = s.Attribute("attr2").Value, 
       }).First(); 

但它看起來很醜,我想問問有沒有更清晰的方法來做到這一點?

回答

2

你可以指定一個「路徑」用.Element().Elements(),消除了where lambda表達式。

// untested 
var child_1 = from s in doc.Root.Element("child_1").Elements("sub_child") 
      select new SubChild { 
      a1 = s.Attribute("attr1").Value, 
      a2 = s.Attribute("attr2").Value, 
      }; 
1

要進一步進行幾個步驟,您可以創建一個包含所有子元素的字典。這將允許您按名稱直接訪問每個元素的SubChild

Dictionary<string, List<SubChild>> dict = doc.Root.Elements().ToDictionary(
    e => e.Name.ToString(), 
    e => e.Elements("sub_child") 
      .Select(s => new SubChild 
         { 
          a1 = s.Attribute("attr1").Value, 
          a2 = s.Attribute("attr2").Value, 
         }).ToList()); 
dict["child_1"][0] // get the first subchild of "child_1" 
0

您是否真的必須使用linq to xml?

public IEnumerable<SubChild> GetSubChilds(XmlDocument xd) 
{ 
    foreach (XmlNode subChild in xd.SelectNodes("/root/*/*")) 
    { 
     if (subChild.Name.StartsWith("sub_child")) 
     { 
      XmlAttributeCollection atts = subChild.Attributes; 
      yield return new SubChild { a1 = atts["attr1"].Value, a2 = atts["attr2"].Value }; 
     } 
    } 
} 
+0

但這是否比LInq好?請注意,您需要其中2個參數。想象一下路徑的變化。 –