C# XDocument未正确加载

C# XDocument未正确加载,c#,linq,linq-to-xml,C#,Linq,Linq To Xml,我一直在复制饼干点击器。为了保存游戏,我将其保存为XML格式。例如: <save> <cookies>1</cookies> <clickers>0</clickers> <workers>0</workers> <factories>0</factories> <slavecountries>0</slavecountries> <w

我一直在复制饼干点击器。为了保存游戏,我将其保存为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>

当我尝试将变量设置为数据变量时,会出现异常。Cookies=long.Parsedata.FirstOrDefault.Cookies;。为什么不能正确加载?

现在忽略错误条件,即元素名称不匹配、缺少元素,以下内容适用于您。就我所见,原始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;

我将把它作为一个练习留给您,让您将这些变量放入您的变量对象中。但在该部分中,请记住,您可能需要处理输入的数字也无效的情况,即使用long.TryParse

忽略错误条件,即元素名称不匹配、缺少元素,以下内容适用于您。就我所见,原始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;
我将把它作为一个练习留给您,让您将这些变量放入您的变量对象中。但在该部分中,请记住,您可能需要处理输入的数字也无效的情况,即使用long.TryParse

首先,根是,因此您要迭代rootRoot.genderantsSave的所有元素,它是空集,即没有元素

其次,子体将迭代所有子元素,所以元素正在加载所讨论的节点的一个元素,而该节点并不存在

您要查找的代码是:

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..
首先,根是空的,因此您要迭代rootRoot.genderantsSave的所有元素,它是空集,即没有元素

其次,子体将迭代所有子元素,所以元素正在加载所讨论的节点的一个元素,而该节点并不存在

您要查找的代码是:

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..
从查询中删除Root并直接使用doc.degenantsSave,如下所示

    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);
    }
从查询中删除Root并直接使用doc.degenantsSave,如下所示

    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);
    }

您的doc.Root是save元素,该元素没有save what类型的后代,从而导致枚举为空,调用FirstOrDefault将返回null导致ExceptionId的结果是什么您是否尝试使用断点检查数据变量?那个物体里有什么?你能粘贴堆栈跟踪吗?同样,这样做意味着每次调用.FirstOrDefault时都会重新计算xml,这非常糟糕。执行var data=from[…]}.FirstOrDefault,只需调用data.cookies、data.clickers等。doc.Root是save元素,该元素没有save what类型的后代,save what将导致空枚举,调用FirstOrDefault将返回null what results what results in Your exceptionId是否尝试使用断点检查数据变量?那个物体里有什么?你能粘贴堆栈跟踪吗?同样,这样做意味着每次调用.FirstOrDefault时都会重新计算xml,这非常糟糕。dovar data=from[…]}.FirstOrDefault,并简单地调用data.cookies、data.clickers等。变量不是对象,而是静态类;当使用加载保存文件本身的方法时,我也使用try-catch块。酷-这样就可以了,在这种情况下不需要LINQ;在使用加载保存文件本身的方法时,我也使用try-catch块。酷-这样就可以了,在这种情况下不需要LINQ。