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数据中是否存在用户名。如果它这样做了,它就会读取它并返回该字符串。如果没有,它就会创建它。
此外:"这个问题没有表明任何研究工作;它不清楚或没有用处"怎样
第二个问题:需要使用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
类型,