Question

I've been making a clone of Cookie Clicker. To save the game, I save it to XML format. Example:

<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>

Loading code:

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

I get an exception when I try to set my variables to the data (Variables.Cookies = long.Parse(data.FirstOrDefault().cookies);). Why isn't it loading properly?

Était-ce utile?

La solution

Remove Root from query and use directly doc.Descendants("save") as shown in below

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

Autres conseils

Ignoring error conditions for now (ie element names not matching, missing elements), the following will work for you. The original LINQ isn't necessary as far as I can see, as you only have one root element.

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;

I'll leave it as an exercise for you to put these into your Variables object. But in that section, bear in mind you may want to deal with the case where the numbers entered aren't valid also, i.e. use long.TryParse

First, the root is <Save> so you are iterating all <save> elements of the root(Root.Descendants("save")), which is empty set i.e. there is no <save><save></save></save> element.

Second, Descendants will iterate over all child elements, so Element is loading an element of the node in question, which does not exist.

The code you are looking for is:

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..
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top