XDocument无法正确加载

时间:2014-03-25 10:20:27

标签: c# linq linq-to-xml

我一直在克隆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);)时出现异常。为什么它没有正确加载?

3 个答案:

答案 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..