如何使用 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 2008 自动恢复目录位置更改

从对多个数据网格的更改更新本地存储的数据库(Visual Studio C#,使用 OLEDB 的 Access 数据库)

Visual Studio 2013 为C#类文件添加版权信息

使用 c# 将 Visual Studio .net 2003 转换为 2008