就地修改XML文件

本文关键字:文件 XML 修改 | 更新日期: 2023-09-27 18:11:03

假设我有以下XML文件:

<book>
 <name>sometext</name>
 <name>sometext</name>
 <name>sometext</name>
 <name>Dometext</name>
 <name>sometext</name>
</book> 

如果我想通过将D更改为s来修改内容(如第四个"name"节点所示),而无需读取/写入整个文件,这可能吗?

就地修改XML文件

10mb的文件不成问题。把它吸起来。修改DOM。将其写回文件系统。10gb是个大问题。在这种情况下:

假设:您没有更改文件的长度。将文件视为字符数组,而不是字符(链接)列表:您不能在中间添加字符,只能更改它们。

您需要seek在文件中的位置更改,然后write该字符到磁盘。

在。net世界中,对于FileStream对象,您需要将Position属性设置为D字符的索引,然后编写单个s字符。看看这个关于随机访问文本文件的问题。

也阅读这个问题:如何使用c#在文件中插入字符。看起来您不能真正使用FileStream对象,而必须诉诸于写入单个字节。

好运。但实际上,如果我们谈论的只有10mb,那么就尽情享用吧。电脑应该在做你的工作

我只是读入文件,处理,然后输出。

这可以用XmlReader以流方式完成——它比XmlDocument或XDocument更需要手工操作,但它避免了在内存中创建DOM (XmlDocument/XDocument可以与相同的读/写模式一起使用,但通常需要在内存中进行完整的重建):

  1. 打开文件输入流(XmlReader)
  2. 打开输出文件流(XmlWriter, 到另一个文件)
  3. 从XmlReader读取并写入XmlWriter执行必要的任何转换。
  4. <
  5. 关闭流/gh>
  6. 将新文件移动到旧文件(覆盖,原子动作)

虽然这个可以设置为在同一个打开的文件上处理输入和输出,使用一堆非常聪明的工作不会保存任何东西,并且有许多边缘情况,包括增加或减少文件长度。事实上,尝试简单地向后移动文件的内容以填补空白或向前移动文件内容以腾出新的空间可能会更慢。除了最基本的长度保持操作外,文件系统缓存可能会使任何"收益"最小化或没有意义。此外,就地修改文件不是原子操作,并且在发生错误时通常是不可恢复的:以临时文件为代价,读/写/移动方法对最终文件内容是原子操作。

或者,考虑XSLT——它就是为此而设计的;-)

快乐编码。

最干净(也是最好)的方法是使用XmlDocument对象进行操作,但一种快速而不干净的解决方案是直接将XML读取为字符串,然后:

xmlText = xmlText.Replace("Dometext", "sometext");

XML文件是文本文件,不允许插入/删除。唯一支持的变化是OverWrite和Append。不适合XML。

首先要确定你真的需要这个。这是一个复杂的操作,只有在非常大的文件上才值得。

由于长度可能会发生变化,您至少必须移动之后的所有。多次替换的可能性意味着您可能需要一个大的缓冲区来适应更改。

复制整个文件更容易。这在I/O上是很昂贵的,但是可以节省内存使用。