繁体   English   中英

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

[英]How to overwrite/edit XML element in C#

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

我希望这是有道理的,但是如果我输入250岁的约翰·史密斯这个名字,以防万一,那么,我想改一下错字,所以我会再次输入25岁的约翰·史密斯。我这样做是创建一个新元素来添加另一个约翰·史密斯,有没有办法编辑/覆盖现有元素? 如果有帮助,我将发布用于创建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);

您可以检索所需的元素,并使用其.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);

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

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

var existing = Xdoc.Descendants("Member").FirstOrDefault(m => m.Element("Name")?.Value == txtName.Text);

if (existing != null) //name existed in xml
{
      existing.Element("Age").Value = txtAge.Text;
      //....
      //....
}
else
{
      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));

使用XElement.SetElementValue(element, value)

例:

xml.SetElementValue("Age", 25);

解决这个问题的另一种方法,在这种情况下听起来像是一个过大的杀伤力:如何将元素名称及其值首先存储在HashMap中,然后遍历HashMap并创建XML元素。 并在有人编辑值时逆转该过程。 因此,只要有人进行编辑,就可以将元素转储到HashMap中,更新元素值,然后重新创建xml元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM