2014-03-03 65 views
-3

的子節點所以我currentlty試圖解析它看起來像這樣的XML文件:我想在每個員工閱讀讀取XML文件 - 讀取其中有任意數量的子節點

<employees> 
    <employee> 
    <id>1</id> 
     <projects> 
      <projectID>7</projectID> 
      <projectID>3</projectID> 
     </projects> 
    </employee> 
    <employee> 
    <id>2</id> 
     <projects> 
      <projectID>4</projectID> 
     </projects> 
    </employee> 
</employees> 

和出現任何數量的項目。 Employee對象是一個字符串和列表(int)。

目前我有:

 XmlDocument doc = new XmlDocument(); 
     doc.Load(path); 
     XmlNodeList xmlNodes = doc.DocumentElement.SelectNodes("/employees/employee"); 
     foreach (XmlNode xmlNode in xmlNodes) 
     { 
      string id; 
      List<int> projects = new List<int>(); 

      id = xmlNode.SelectSingleNode("id").InnerText; 

      //this is the bit. What I have works but it feels like it could 
      //be majorly refined. Is there a better way to construct the foreach below? 

      foreach (XmlNode node in xmlNode.ChildNodes.Item(1)) 
      //index 1 is the projects node 
      { 
       projects.Add(int.Parse(node.InnerText)); 
      } 

      // 

      Employee e = new Employee(id, projects); 
      e.Add(e); 
     } 

如果XML文件本身就是一個問題,它可以改變,以適應解析。

謝謝。

+0

您是否必須使用XmlDocument?使用LINQ to XML(XDocument等)通常使事情變得更簡單。 –

+0

你想完善什麼?有沒有任何性能問題,或者你現在不喜歡代碼的外觀? –

+0

如果您使用XMLDocument,則可以使用Enumerator並查看每個節點。例如 - XmlNodeList xmlNodes = doc.DocumentElement.SelectNodes(「/ employees/employee」); IEnumerator enumList = doc.GetEnumerator()然後通過它循環 – HappyLee

回答

1

這將是與LINQ更容易XML:

var xDoc = XDocument.Load(path); 
var employees = (from e in xDoc.Root.Elements("employee") 
       let projects = e.Element("projects") 
           .Elements("projectID") 
           .Select(p => (int)p) 
           .ToList() 
       let id = (string)e.Element("id") 
       select new Employee(id, projects)).ToList(); 

你需要using System.Linqusing System.Xml.Linq,使其工作。

+0

有了這個,我似乎得到了「未設置爲對象實例的對象引用」異常被拋出。這可能是因爲Employee沒有設置或實例化?編輯:沒關係,我在使用「項目」應該是錯的東西!感謝:) – user1795294

+0

我有一個問題,添加到列表的每個新的主管實例。 – user1795294