繁体   English   中英

是否就地修改XML文件?

[英]Modifying XML file in-place?

假设我有以下XML文件:

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

如果我想通过将D更改为s来修改内容(如第四个“名称”节点中所示)而不必读/写整个文件,这可能吗?

一个10 MB的文件不是问题。 啜饮它。 修改DOM。 将其写回文件系统。 10 GB更是一个问题。 在这种情况下:

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

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

在.NET世界中,使用FileStream对象,您可以将Position属性设置为D字符的索引,然后编写单个s字符。 查看有关文本文件随机访问的问题

另请阅读此问题: 如何使用C#将字符插入文件 看起来你不能真正使用FileStream对象,而是必须求助于编写单个字节。

祝好运。 但实际上,如果我们只谈论10 MB,那么就把它搞砸了。 电脑应该做你的工作。

我只是读入文件,处理并吐出来。

这可以使用XmlReader以流式方式完成 - 它比XmlDocument或XDocument更多的手动工作,但它确实避免创建内存中的DOM(XmlDocument / XDocument可以使用相同的读/写模式,但通常需要在内存中完全重建):

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

虽然这可以设置为在同一个打开的文件上处理输入和输出,但是一堆非常聪明的工作将不会保存任何边缘情况,包括增加减少文件长度。 实际上,尝试简单地向后移动文件内容以填补空白或将文件内容向前移动以创建新空间可能会更慢 除了最基本的长度保留操作之外,文件系统缓存可能会使任何“增益”最小/没有任何意义。 此外,在适当的位置修改文件不是原子操作,并且在出现错误时通常是不可恢复的:以临时文件为代价,读/写/移动方法与最终文件内容相同。

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

快乐的编码。

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

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

XML文件是文本文件,不允许插入/删除。 支持的唯一突变是OverWrite和Append。 与XML不太匹配。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM