替换读取文本中的值

Replacing values in text on-read

所以,我有一个问题: 我想阅读的文本存储在 .xml 文件中,但它包含标记为 $PARAMETER_NAME$ (f.e. $UserName$).

的参数

我还有 Dictionary<string, string>,其中包含所有必需的 key/value 对。 我想反序列化 xml 文件,但我需要用相应的值替换参数。 我想出的唯一解决方案是读取整个文件并替换每个值,但这种方法消耗太多内存并且很幼稚

我能否以某种方式覆盖 FileStream 的 Read() 方法来替换读取时的值?

我以前确实做过这种事情,将导出为 PDF 文件的文档与 MD5 进行比较。我需要让流忽略 pdf 中存在的创建时间戳。基本方法如下:

  • 创建一个继承 FileStream
  • 的 class
  • 添加一个带有您要使用的普通文件流参数的构造函数,并将您的 Dictionary 作为额外参数,让它使用原始参数调用 base(...),然后在您自己的构造函数中,将字典存储在私有变量中。
  • 还是在构造函数中,遍历字典的键并将最长键字符串的长度保存在私有变量中。
  • 覆盖 Read(byte[] buffer, int offset, int count) 并实现它,以便它读取所需的长度,加上前后(当然就文件而言)最长字符串的长度。一旦你有了这个更长的范围,搜索并替换其中的字符串。您之前和之后阅读的额外内容将确保您掌握所有参数。更换后,确保再次将其缩小到原始要求的尺寸。
  • 由于您的参数和数据的长度实际上并不匹配,因此您需要找到一种方法来解决文档读取指针与提供给 Read 函数的指针之间不可避免的不同步问题。
  • 确保也覆盖 int ReadByte() 以调用完整的基于缓冲区的读取,以便它也捕获这些参数。

请注意,由于您使用的是字符串,因此在 xml 文件中的文本编码方面可能会有一些额外的复杂性;如果是 UTF-16,每个字符毕竟是 两个 字节。就个人而言,如果您知道期望的输入是什么,我会将编码作为参数提供给构造函数;比必须在编写器中为其添加某种混乱的检测更容易。

这是我为 PDF 阅读而写的class,但它只用相同长度的空字符串替换了匹配项。

http://sourceforge.net/p/lmsda/code/HEAD/tree/trunk/DokeosUpload/persistence/document/PDFFilterFileStream.cs

不过,您必须弄清楚如何解决指针不同步问题,以防读取指针在读取过程中被手动更改。你永远不知道 xml 解析器的内部是如何处理它的;他们可能偶尔会回顾以前的标签。

您可能必须提前从您的构造函数中对文件进行全面扫描,并让它生成您找到密钥的所有偏移量以及该位置上的密钥的完整列表。对于任何请求的随机访问读取,这似乎是制作一种方法来可靠地将请求的读取指针调整到文件中正确的实际偏移量的唯一方法。