C#-多次读取XML的问题.同时错误检查是否存在.[XElement]

本文关键字:是否 检查 错误 存在 XElement 读取 XML 问题 C#- | 更新日期: 2023-09-27 18:00:06

更新了以下建议的更改。

我已经试着去bug了大约2天了,断断续续地花了3-4个小时,但还没有走多远。感谢您的帮助。

好吧,基本上每次有人死的时候都会发生这种情况。如果我运行一次,它运行良好。然而,如果我第二次运行它,它不会返回任何结果。

public static string Death(string username)
    {
        if (File.Exists(path))
        {
            XElement kd = XElement.Load(path);
            Console.WriteLine("[SimplePlugin] Death Recorded for: " + username + "!");
            var player = kd.Elements("player").Single(p => p.Attribute("name").Value == username);
            int add = int.Parse(player.Element("deaths").Value) + 1; //Dies Here.
            player.SetElementValue("deaths", add);
            player.Save(path);
            kills = int.Parse(player.Element("kills").Value);
            deaths = int.Parse(player.Element("deaths").Value);
            return (username + " has " + kills + " kills and " + deaths + " deaths.");
        }
        else
        {
            Console.WriteLine("[SimpleStats] Writing SimpleConfig.XML...");
            XElement kd = new XElement(
            "SimpleStats",
            new XElement("player",
                new XAttribute("name", username),
            new XElement("kills", 0),
            new XElement("deaths", 0),
            new XElement("time", 0)));
            kd.Save(path);
            Console.WriteLine("[Simple] Done!");
            return (username + " has " + kills + " kills and " + deaths + " deaths.");
        }
    }

我的第二个问题是当XML中的播放器name="name"已经存在时。即使用户名匹配,它也会重新创建它。

代码:

public static string Load(string username)
    {
        if (File.Exists(path))
        {
            XElement kd = XElement.Load(path);
            var player = kd.Elements("player").SingleOrDefault(p => p.Attribute("name").Value == username);
            Console.WriteLine(player);
            if (player == null)
            {
                Console.WriteLine("[SimplePlugin] Writing new XML data for " + username + ".");
                kd.Add(new XElement("player",
                               new XAttribute("name", username),
                           new XElement("kills", 0),
                           new XElement("deaths", 0),
                           new XElement("time", 0)));
                kd.Save(path);
                return (username + " has " + kills + " kills and " + deaths + " deaths.");
            }
            else
            {
                kills = int.Parse(player.Element("kills").Value);
                deaths = int.Parse(player.Element("deaths").Value);
                return (username + " has " + kills + " kills and " + deaths + " deaths.");
            }
        }
        else
        {
            Console.WriteLine("Doesnt Exist");
            Console.WriteLine("[SimpleStats] Writing SimpleConfig.XML...");
            XElement player = new XElement(
            "SimpleStats",
            new XElement("player",
                new XAttribute("name", username),
            new XElement("kills", 0),
            new XElement("deaths", 0),
            new XElement("time", 0)));
            player.Save(path);
            Console.WriteLine("[Simple] Done!");
            return (username + " has " + kills + " kills and " + deaths + " deaths.");
        }
    }

一个字符串被发送到Load()。加载检查xml是否存在。如果没有,则创建它。如果是,则创建。然后检查xml数据中是否存在用户名。如果它这样做了,它就会读取它并返回该字符串。如果没有,它就会创建它。

此外:"这个问题没有表明任何研究工作;它不清楚或没有用处"怎样

C#-多次读取XML的问题.同时错误检查是否存在.[XElement]

第二个问题:需要使用Value属性来获取属性值。

var player = kd.Elements("player").SingleOrDefault(p => p.Attribute("name").Value == username);

您需要修改整个代码。例如,这些行会给您带来意想不到的结果:

kills = (int)player.Element("kills"); // explicit casting XElement to int, will  return the pointer value.
deaths = (int)player.Element("deaths");

正确的顺序是

kills = int.Parse(player.Element("kills").Value);
deaths = int.Parse(player.Element("deaths").Value);

对于您的第一个问题,执行以下

player.Element("deaths").Value = Convert.ToInt32(player.Element("deaths").Value) + 1;

由于XElement.Value属于System.String类型,