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);)时,我得到一个异常。为什么不能正常加载?

XDocument没有正确加载

从查询中删除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..