0

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

2 回答 2

1

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

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

您还没有真正解释中间步骤中发生的事情,但有两种可能的选择:

  • 您可以让其余代码直接了解 XML
  • 您可以将 XML 隐藏在另一个类中 - 因此您将在该类中有一个XmlDocumentorXDocument作为成员变量,并且调用代码如下所示:

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

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

于 2013-07-08T09:26:15.320 回答
0

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

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

保存并加载到 Memory Stream

于 2013-07-08T09:33:35.870 回答