我一直在克隆Cookie Clicker。为了保存游戏,我将其保存为XML格式。示例:
<save>
<cookies>1</cookies>
<clickers>0</clickers>
<workers>0</workers>
<factories>0</factories>
<slavecountries>0</slavecountries>
<worlds>0</worlds>
<planets>0</planets>
<universes>0</universes>
<realities>0</realities>
</save>
正在加载代码:
var doc = XDocument.Parse(save);
var data = from item in doc.Root.Descendants("save")
select new
{
cookies = item.Element("cookies").Value,
clickers = item.Element("clickers").Value,
workers = item.Element("workers").Value,
factories = item.Element("factories").Value,
slavecountries = item.Element("slavecountries").Value,
worlds = item.Element("worlds").Value,
planets = item.Element("planets").Value,
universes = item.Element("universes").Value,
realities = item.Element("realities").Value
};
Variables.Cookies = long.Parse(data.FirstOrDefault().cookies);
Variables.Clickers = long.Parse(data.FirstOrDefault().clickers);
Variables.Workers = long.Parse(data.FirstOrDefault().workers);
Variables.Factories = long.Parse(data.FirstOrDefault().factories);
Variables.SlaveCountries = long.Parse(data.FirstOrDefault().slavecountries);
Variables.Worlds = long.Parse(data.FirstOrDefault().worlds);
Variables.Planets = long.Parse(data.FirstOrDefault().planets);
Variables.Universes = long.Parse(data.FirstOrDefault().universes);
Variables.Realities = long.Parse(data.FirstOrDefault().realities);
当我尝试将变量设置为数据(Variables.Cookies = long.Parse(data.FirstOrDefault().cookies);
)时出现异常。为什么它没有正确加载?
答案 0 :(得分:3)
从查询中移除Root
并直接使用doc.Descendants("save")
,如下所示
XDocument doc = XDocument.Load(@"D:\test.xml");
var data = from item in doc.Descendants("save")
select new
{
cookies = item.Element("cookies").Value,
clickers = item.Element("clickers").Value,
workers = item.Element("workers").Value,
factories = item.Element("factories").Value,
slavecountries = item.Element("slavecountries").Value,
worlds = item.Element("worlds").Value,
planets = item.Element("planets").Value,
universes = item.Element("universes").Value,
realities = item.Element("realities").Value
};
foreach (var item in data)
{
Console.WriteLine(item);
}
答案 1 :(得分:1)
暂时忽略错误条件(即元素名称不匹配,缺少元素),以下内容适合您。据我所知,原来的LINQ并不是必需的,因为你只有一个根元素。
var doc = XDocument.Parse(save);
var cookies = doc.Root.Element("cookies").Value;
var clickers = doc.Root.Element("clickers").Value;
var workers = doc.Root.Element("workers").Value;
var factories = doc.Root.Element("factories").Value;
var slavecountries = doc.Root.Element("slavecountries").Value;
var worlds = doc.Root.Element("worlds").Value;
var planets = doc.Root.Element("planets").Value;
var universes = doc.Root.Element("universes").Value;
var realities = doc.Root.Element("realities").Value;
我将它作为练习留给你将它们放入你的Variables
物体。但在该部分中,请记住您可能想要处理输入的数字也无效的情况,即使用long.TryParse
答案 2 :(得分:1)
首先,根是<Save>
,因此您正在迭代根(<save>
)的所有Root.Descendants("save")
元素,这是空集,即没有<save><save></save></save>
元素。
其次,Descendants
将遍历所有子元素,因此Element
正在加载相关节点的元素,该元素不存在。
您正在寻找的代码是:
var doc = XDocument.Parse(save);
var root = doc.Root;
Variables.Cookies = long.Parse(root.Element("cookies").Value);
Variables.clickers = long.Parse(root.Element("clickers").Value);
etc..