写入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());
}
}
流程如下:
- 打开文件(然后立即关闭)
- 关闭文件
- SetFirstElementValueByElementId(更改xml文件中的某些内容)
- SaveFile(每次我进行更改时都必须调用,否则它们不会反映在文件上)
只需将生命周期分为三部分:
- 加载XML文件(我建议使用LINQ to XML而不是旧的
XmlDocument
API,但无论您需要做什么…) - 执行所需的所有修改
- 最后保存
您还没有真正解释中间步骤中发生了什么,但有两个潜在的选择:
- 您可以让代码的其余部分直接了解XML
-
您可以将XML隐藏在另一个类中,这样您就可以将
XmlDocument
或XDocument
作为类中的成员变量,调用代码看起来像: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中并使用它,直到您想将文件保存到磁盘。
下面的链接解释了如何做到这一点。
保存并加载到内存流