需要帮助清理我的XML解析器代码
本文关键字:代码 XML 我的 帮助 | 更新日期: 2023-09-27 18:25:38
因此,我正在努力熟悉XML。为了做到这一点,我创建了一个简单的XML文件,之后我创建了C#脚本来读取该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数据并将其存储在不同的列表中。这似乎是一个不必要的步骤,但我没能以任何其他方式让它发挥作用。
一旦您有了后代,只需执行一个选择,即可将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();