C#-无法保存自定义linq到xml文件,其中包含新元素?

C#-无法保存自定义linq到xml文件,其中包含新元素?,c#,xml,linq-to-xml,xelement,C#,Xml,Linq To Xml,Xelement,我正在创建一个新的XDocument,并在其中插入根元素“profiles”,然后保存 if (!System.IO.File.Exists("profiles.xml")) { XDocument doc = new XDocument( new XElement("profiles") ); doc.Save("profiles.xml", SaveOptions.None); } 然后,稍后我将接受用户输入并将配置文件添加到已创建的xml文件中:

我正在创建一个新的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);
XElement配置文件=
新XElement(Player.Name,
新XElement(“级别”,玩家级别),
新XElement(“现金”,玩家。现金)
);
XDocument doc=XDocument.Load(“profiles.xml”);
列表配置文件=doc.Root.Elements().ToList();
对于(int i=0;i
但出于某种原因,它永远不会添加任何新的配置文件


编辑:另外,如果我在xml文件中手动创建一个新的配置文件,它也不会自定义,因此问题在于保存该文件?

您实际上从未做过任何事情来更改
XDocument
doc
引用的任何元素:

  • 如果找到具有现有名称的元素,则修改列表,但不会修改文档。您可能希望使用:

    请注意,在本例中,您甚至没有再次尝试保存XML文件(由于
    return
    语句),因此不清楚您在本例中试图实现什么

  • 如果找不到元素,则将
    profile
    元素添加到其自身,这肯定不会修改文档。我怀疑你想要:

    doc.Root.Add(profile);
    
    换句话说,添加新的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);
另外,我强烈建议您不要使用播放器名称作为元素名称。将其用作属性值或文本值,例如

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();
@Mahi:我已经(两次)解释了为什么替换不起作用,但是请看我的编辑,它建议了一种不同的方法,包括重新构造XML。
var existingElement = doc.Root
                         .Elements()
                         .Where(x => (string) x.Attribute("name)" == Player.name)
                         .FirstOrDefault();