2014-10-06 84 views
1

所以,我想讓自己熟悉XML。爲此,我創建了一個簡單的XML文件,然後創建了一個C#腳本來讀取該XML文件。現在一切都按預期工作,但代碼感覺很糟糕。需要幫助清理我的XML解析器代碼

我的XML看起來是這樣的:

<buildings> 
    <building> 
     <name>House</name> 
     <buildTime>5</buildTime> 
     <treeCost>100</treeCost> 
     <stoneCost>10</stoneCost> 
     <goldCost>10</goldCost> 
    </building> 

    <building> 
     <name>Tower</name> 
     <buildTime>5</buildTime> 
     <treeCost>10</treeCost> 
     <stoneCost>300</stoneCost> 
     <goldCost>50</goldCost> 
    </building> 
</buildings> 

而且我的C#代碼如下所示:

XDocument xmlDoc = XDocument.Load ("BuildingGame_Data/Buildings.xml"); 

    var names = xmlDoc.Descendants("building").Descendants("name"); 
    var buildTimes = xmlDoc.Descendants("building").Descendants("buildTime"); 
    var treeCosts = xmlDoc.Descendants("building").Descendants("treeCost"); 
    var stoneCosts = xmlDoc.Descendants("building").Descendants("stoneCost"); 
    var goldCosts = xmlDoc.Descendants("building").Descendants("goldCost"); 

    List<string> namesList = new List<string>(); 
    List<int> buildTimesList = new List<int>(); 
    List<int> treeCostsList = new List<int>(); 
    List<int> stoneCostsList = new List<int>(); 
    List<int> goldCostsList = new List<int>(); 

    foreach (string n in names) 
    { 
     namesList.Add(n); 
    } 

    foreach (string b in buildTimes) 
    { 
     buildTimesList.Add(System.Convert.ToInt32(b)); 
    } 

    foreach (string t in treeCosts) 
    { 
     treeCostsList.Add(System.Convert.ToInt32(t)); 
    } 

    foreach (string s in stoneCosts) 
    { 
     stoneCostsList.Add(System.Convert.ToInt32(s)); 
    } 

    foreach (string g in goldCosts) 
    { 
     goldCostsList.Add(System.Convert.ToInt32(g)); 
    } 


    List<Building> buildings = new List<Building>(); 
    for (int i = 0; i < namesList.Count; i++) 
    { 
     buildings.Add(new Building(namesList[i], buildTimesList[i], treeCostsList[i], stoneCostsList[i], goldCostsList[i])); 
    } 

現在,我想辦法跳過,我將我所有的XML中間部分數據並將其存儲在不同的列表中。這似乎是一個不必要的步驟,但我無法以任何其他方式使其工作。

回答

2

一旦你有你的後代只是做一個選擇映射到您的類的XML。您可以使用Element來獲取「建築物」的子元素並將其轉換爲正確的值。

var buildings = xmlDoc.Descendants("building") 
         .Select(be => new Building (
          (string)be.Element("name"), 
          (int)be.Element("buildTime"), 
          (int)be.Element("treeCost"), 
          (int)be.Element("stoneCost"), 
          (int)be.Element("goldCost"))) 
         .ToList(); 
+0

當我實現這個我得到一個錯誤說「類型'System.Collections.Generic.IEnumerable ‘不包含'選擇的定義’,並沒有擴展方法選擇' 'System.Collections.Generic.IEnumerable '類型可以找到(你是否缺少使用指令或程序集引用?)「 – 2014-10-06 12:44:27

+1

@JesperEvertsson您需要添加'使用System.Linq ;' – juharr 2014-10-06 12:47:37

+0

謝謝,現在它按預期工作。現在唯一的問題是我不太瞭解代碼。你有什麼建議,我可以閱讀這個主題,並瞭解發生了什麼? – 2014-10-06 12:50:17