[英]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.