我正在创建一个新的XDocument并在其中插入根元素“profiles”,然后保存。
if (!System.IO.File.Exists("profiles.xml"))
{
XDocument doc = new XDocument(
new XElement("profiles")
);
doc.Save("profiles.xml", SaveOptions.None);
}
然后我想接受用户输入并将配置文件添加到已创建的xml文件中:
XElement profile =
new XElement(Player.Name,
new XElement("level", Player.Level),
new XElement("cash", Player.Cash)
);
XDocument doc = XDocument.Load("profiles.xml");
List<XElement> profiles = doc.Root.Elements().ToList();
for (int i = 0; i < profiles.Count; i++)
{
if (profiles[i].Name.ToString() == Player.name)
{
profiles[i] = profile;
return;
}
}
profile.Add(profile);
doc.Save("profiles.xml", SaveOptions.None);
但出于某种原因,它永远不会添加任何新的个人资料?
编辑:另外,如果我手动在xml文件中创建一个新的配置文件,它也不会自定义,所以问题在于保存文件?
答案 0 :(得分:3)
您实际上从未采取任何措施来更改XDocument
引用的doc
中的任何元素:
如果您找到具有现有名称的元素,则表示您正在修改列表,但这不会修改文档。您可能想要使用XElement.ReplaceWith
:
profiles[i].ReplaceWith(profile);
请注意,在这种情况下,您甚至没有尝试再次保存XML文件(由于return
语句),所以在这种情况下您要尝试实现的目标并不是很清楚。
如果您没有找到该元素,那么您要将profile
元素添加到自身,这肯定不会修改文件。我怀疑你想要:
doc.Root.Add(profile);
换句话说,将新的个人资料元素添加为根元素的新最终子元素。
XDocument doc = XDocument.Load("profiles.xml");
var existingElement = doc.Root
.Elements()
.Where(x => x.Name.ToString() == Player.name)
.FirstOrDefault();
if (existingElement != null)
{
existingElement.ReplaceWith(profile);
}
else
{
doc.Root.Add(profile);
}
doc.Save("profiles.xml", SaveOptions.None);
此外,我强烈建议你不使用播放器名称作为元素 name 。请将其用作属性值或文本值,例如
XElement profile =
new XElement("player",
new XAttribute("name", Player.Name),
new Attribute("level", Player.Level),
new XAttribute("cash", Player.Cash)
);
如果玩家名称有空格等,那么你就不会有问题。然后你需要将你的查询改为:
var existingElement = doc.Root
.Elements()
.Where(x => (string) x.Attribute("name)" == Player.name)
.FirstOrDefault();