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

时间:2013-07-08 09:20:41

标签: c# xml file-io

我有一个我需要写的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. OpenFile(然后立即关闭)
  2. CloseFile
  3. SetFirstElementValueByElementId(更改xml文件中的内容)。
  4. SaveFile(每次进行更改时都必须调用,否则它们不会反映在文件中)。

2 个答案:

答案 0 :(得分:1)

将生命周期分为三个部分:

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

你还没有真正解释中间步骤发生了什么,但有两种可能的选择:

  • 您可以让其他代码直接了解XML
  • 您可以在另一个类中隐藏XML - 因此您在类中有一个XmlDocumentXDocument作为成员变量,调用代码如下所示: / p>

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

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

答案 1 :(得分:0)

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

以下链接说明了如何操作。

Save and load to Memory Stream