写入XML文件并在最后只保存更改

本文关键字:最后 保存更改 XML 文件 写入 | 更新日期: 2023-09-27 18:21:39

我有一个需要写入的XML文件

//Code to open the File
public void Open(string FileName, string FilePath)
    {
        try
        {
            XmlDoc = new XmlDocument();
            XmlDoc.PreserveWhitespace = true;
            XmlnsManager = new XmlNamespaceManager(mXmlDoc.NameTable);
            XmlnsManager.AddNamespace("", "urn:xmldata-schema");
            FileStream = new FileStream(@Path.Combine(FilePath, FileName),
                FileMode.Open, FileAccess.ReadWrite);
            XmlDoc.Load(FileStream);
        }
        catch (Exception inException)
        {
            MessageBox.Show(inException.ToString());
        }
    }
   //Code to write to the file
   public void SetValueByElementName(string Name, string Value)
   {
        try
        {
            XmlNode node = XmlDoc.SelectSingleNode("//" + inElementID, XmlnsManager);
            node.InnerText = Value;
        }
        catch (Exception inException)
        {
            MessageBox.Show(inException.ToString());
        }
    }
//Code to save the file
public void Save()
    {
        try
        {
            XmlDoc.Save(@Path.Combine(XmlFilePath, XmlFileName));
            IsFileModified = false;
        }
        catch (Exception inException)
        {
            MessageBox.Show(inException.ToString());
        }
    }

然而,这个类的实现是,每次我需要在XML文件中写入一些东西时,我都必须保存它。现在,我被告知必须更改它,而应该发生的是,我只需要保存一次,那是在读/写完成时。我怎样才能做到这一点?

编辑:

我忘了补充一下:有一件事我不太明白,那就是实现需要立即关闭文件流。

 //Code to close stream
 private void CloseStream()
    {
        try
        {
            FileStream.Close();
        }
        catch (Exception inException)
        {
            MessageBox.Show(inException.ToString());
        }
    }

流程如下:

  1. 打开文件(然后立即关闭)
  2. 关闭文件
  3. SetFirstElementValueByElementId(更改xml文件中的某些内容)
  4. SaveFile(每次我进行更改时都必须调用,否则它们不会反映在文件上)

写入XML文件并在最后只保存更改

只需将生命周期分为三部分:

  • 加载XML文件(我建议使用LINQ to XML而不是旧的XmlDocument API,但无论您需要做什么…)
  • 执行所需的所有修改
  • 最后保存

您还没有真正解释中间步骤中发生了什么,但有两个潜在的选择:

  • 您可以让代码的其余部分直接了解XML
  • 您可以将XML隐藏在另一个类中,这样您就可以将XmlDocumentXDocument作为类中的成员变量,调用代码看起来像:

    Foo foo = Foo.Load("test.xml");
    // Whatever you need here...
    foreach (var data in someSource)
    {
        foo.UpdateWithData(data);
    }
    foo.Save("test.xml");
    

    这样,唯一需要理解XML文件结构的类就是Foo。(当然,你可以将其重命名为更合适的名称。)

您可以简单地将FileStream的内容复制到MemoryStream中并使用它,直到您想将文件保存到磁盘。

下面的链接解释了如何做到这一点。

保存并加载到内存流