XDocument没有正确加载
本文关键字:加载 XDocument | 更新日期: 2023-09-27 17:53:13
我一直在制作《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);
)时,我得到一个异常。为什么不能正常加载?
从查询中删除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);
}
现在忽略错误条件(即元素名称不匹配,缺少元素),下面的操作将为您工作。在我看来,原来的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
首先,根是<Save>
,所以你迭代根(Root.Descendants("save")
)的所有<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..