如何使用 c# Visual Studio 更改 XML 文件中的值
Posted
技术标签:
【中文标题】如何使用 c# Visual Studio 更改 XML 文件中的值【英文标题】:How to change a value inside XML file using c# Visual Studio 【发布时间】:2020-09-11 08:43:46 【问题描述】:我正在尝试更改 XML 文件中的值。这是我的 XML“person.xml”文件:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Table>
<Person>
<Number>1</Number>
<Name>Mariano</Name>
<Last Name>Italiano</Last Name>
<Age>36</Age>
</Person>
<Person>
<Number>2</Number>
<Name>John</Name>
<Last Name>Smith</Last Name>
<Age>32</Age>
</Person>
<Person>
<Number>3</Number>
<Name>Bob</Name>
<Last Name>Leckie</Last Name>
<Age>50</Age>
</Person>
<Person>
<Number>4</Number>
<Name>Patrick</Name>
<Last Name>Collins</Last Name>
<Age>63</Age>
</Person>
</Table>
我希望我的程序做一些事情:
找到一个写在 textBox2->Text 中的名字。然后,如果名称存在,我想将其更改为用 textBox3->Text 编写的名称。
如果 CheckBoxDelete 设置为 true,则删除(如果找到)整个 Person
我知道如何创建这样的 XML 文件(在某处找到了一个示例),但我找不到如何在必要时查找和删除的解决方案。
如果重要的话,我正在使用 Visual Studio 2015。
谢谢。
【问题讨论】:
这里有一些选择节点的示例:csharp-examples.net/xml-nodes-by-name,这里删除它:***.com/questions/919645/… 您可以通过使用XDocument 阅读有关linq to xml 的信息,试试这个或@RolandoMedina 命题,我们将通过包含一些代码来帮助您。 不可能直接“删除”文件中的一条记录,但显然可以将整个文档读入内存,反序列化,修改,然后再次序列化为 XML。如前所述:XDocument、LINQ 和 XMLReader 将为您提供帮助。 【参考方案1】:您可以使用XDocument替换值并根据名称删除人员。
代码:
public partial class Form1 : Form
public Form1()
InitializeComponent();
public string filename = "D:\\test.xml";
private void BtnRePlace_Click(object sender, EventArgs e)
XDocument doc = XDocument.Load(filename);
doc.Descendants("Person").Descendants("Name").Where(i => i.Value == txtReplaceFirstName.Text).FirstOrDefault().SetValue(txtReplaceLastName.Text);
doc.Save(filename);
private void btndelete_Click(object sender, EventArgs e)
XDocument doc = XDocument.Load(filename);
doc.Descendants("Person").Where(i => i.Element("Name").Value == txtReplaceFirstName.Text&& i.Element("LastName").Value == txtReplaceLastName.Text).FirstOrDefault().Remove();
doc.Save(filename);
另外,你的 xml 文件有错误,Last Name
应该是 LastName
没有空格。
【讨论】:
我正在尝试修改您的 btndelete_Click 代码,因此如果有两个人的名字相同但姓氏不同,它只会删除一个。如何做到这一点?用于删除的数据存储在 textBoxReplaceFirstName 和 textBoxReplaceLastName @Mariusz,我已经修改了我的代码,你可以检查它是否适合你。【参考方案2】:您可以将数据映射(即反序列化)到 POCO 对象,操作数据并再次序列化。不过可能有点矫枉过正。正如其他人所说,使用 XDocument 可能就足够了。
这是一个最小的例子:
public class Person
[XmlElement]
public int Number get; set;
[XmlElement]
public string Name get; set;
[XmlElement]
public string LastName get; set;
[XmlElement]
public int Age get; set;
public override string ToString() => $"Name LastName is Age";
[XmlRoot("Table")]
public class RootObject
[XmlElement("Person")]
public List<Person> Persons;
class Program
static void Main(string[] args)
var xmlSer = new XmlSerializer(typeof(RootObject));
using var fs = new FileStream("input.xml", FileMode.Open);
var doc = (RootObject)xmlSer.Deserialize(fs);
foreach (var p in doc.Persons)
System.Console.WriteLine(p);
// do whatever with the RootObject instance
【讨论】:
【参考方案3】:XML 是对象,因此请考虑在创建更多 POCO 之前重新使用现有对象。
这里的代码展示了如何在 XML 中查找、删除和更新元素。花一些时间来学习 XPath,它非常强大、灵活,并且几乎可以在所有平台上使用。
using System;
using System.Threading.Tasks;
using System.Xml;
namespace testconsole
class Program
public static string strFileName = "c:\\temp\\test.xml";
static void Main(string[] args)
XmlDocument xml = new XmlDocument();
xml.Load(strFileName);
string strMatchName = "Mariano";
string strXPath = "/Table/Person[Name='" + strMatchName + "']";
XmlElement ndPerson = (XmlElement)xml.SelectSingleNode(strXPath);
if (ndPerson != null)
// Delete if the person is found
ndPerson.ParentNode.RemoveChild(ndPerson);
string strNewName = "Bob";
strXPath = "/Table/Person/Name[.='" + strNewName + "']";
XmlElement ndName = (XmlElement)xml.SelectSingleNode(strXPath);
if (ndName != null)
ndName.InnerText = "Robert"; // new name
xml.Save(strFileName);
【讨论】:
以上是关于如何使用 c# Visual Studio 更改 XML 文件中的值的主要内容,如果未能解决你的问题,请参考以下文章
如何通过访问数据库在visual studio c#中验证注销一次
在 C# Visual Studio 中更改表单元素名称的正确方法是啥?
从对多个数据网格的更改更新本地存储的数据库(Visual Studio C#,使用 OLEDB 的 Access 数据库)