如何在C#中覆盖/编辑XML元素

时间:2016-05-04 17:31:17

标签: c# xml

我正在制作一个程序,它从用户那里获取信息并将其保存为XML文件。该信息包括名称和其他详细信息。我希望能够允许用户输入相同的名称,而不是使用相同名称创建的新元素,它将使用输入的新值覆盖现有元素。

我希望这是有道理的,但如果不是一个例子,如果我输入约翰史密斯的名字,并且年龄250岁。很明显我想改变错字,所以我会再次进入约翰史密斯,年龄25.当我这样做时,会创建一个新元素来添加另一个John Smith,有没有办法只编辑/覆盖现有元素?如果有任何帮助,我会发布用于创建XML的代码!

提前致谢!

XDocument Xdoc = new XDocument(new XElement("XMLFile"));
        if (System.IO.File.Exists(filepath))
        {
            Xdoc = XDocument.Load(filepath);
        }
        else
        {
            Xdoc = new XDocument();
        }

        XElement xml = new XElement("Member");
        xml.Add(new XElement("Name", txtName.Text));
        xml.Add(new XElement("Age", txtAge.Text));
        xml.Add(new XElement("Nationality", txtNationality.Text));
        xml.Add(new XElement("EmailAddress", txtEmailAddress.Text));
        xml.Add(new XElement("ContactNumber", txtContactNumber.Text));


        if (Xdoc.Descendants().Count() > 0)
        {
            Xdoc.Descendants().First().Add(xml);
        }
        else
        {
            Xdoc.Add(xml);
        }

        Xdoc.Save(filepath);

3 个答案:

答案 0 :(得分:1)

您可以使用.Value属性检索所需的元素并设置其值。

请注意,您的代码中存在大错误。当文档最初为空时,您将第一个Member添加为文档的根元素,但之后,您将所有其他Members添加为该第一个成员的子项

以下是执行更新的正确代码,还可以正确添加新成员。

XDocument Xdoc;

if (System.IO.File.Exists(filepath))
{
    Xdoc = XDocument.Load(filepath);
}
else
{
    Xdoc = new XDocument(new XElement("Members"));
}

XElement member = Xdoc
    .Descendants("Member")
    .FirstOrDefault(m => (string) m.Element("Name") == name);

if (member != null)
{
    member.Element("Age").Value = age;
    member.Element("Nationality").Value = age;
    member.Element("EmailAddress").Value = age;
    member.Element("ContactNumber").Value = age;
}
else
{
    XElement newMember = new XElement("Member",
        new XElement("Name", name),
        new XElement("Age", age),
        new XElement("Nationality", nationality),
        new XElement("EmailAddress", email),
        new XElement("ContactNumber", contactNumber)
        );

    Xdoc.Descendants("Members").First().Add(newMember);
}

Xdoc.Save(filepath);

答案 1 :(得分:0)

当然有。加载xml时,根据该名称是否存在创建两个不同的操作路径,然后在保存xml时合并路径:

{{1}}

答案 2 :(得分:0)

使用ignoreSynchronization = true

示例:

XElement.SetElementValue(element, value)

另一种可以解决这个问题的方法,在这种情况下听起来有点矫枉过正: 如何首先在HashMap中存储元素名称及其值,然后迭代HashMap并创建XML元素。当某人正在编辑某个值时,请反转该过程。因此,每当有人进行编辑时,您都会将元素转储到HashMap中,更新元素值,然后重新创建xml元素。