在读取时替换文本中的值
本文关键字:文本 替换 读取 | 更新日期: 2023-09-27 18:07:35
所以,我有一个问题:我想要读取的文本存储在.xml文件中,但它包含标记为$PARAMETER_NAME$
(f.e. $UserName$
)的参数。
我也有Dictionary<string, string>
,其中包含所有所需的键/值对。我想对xml文件进行反序列化,但是我需要用相应的值替换参数。我想到的唯一解决方案是读取整个文件并替换每个值,但这种方法消耗太多内存并且非常幼稚
我能以某种方式覆盖FileStream的Read()
方法来替换读上的值吗?
我实际上以前做过这种事情,将导出为PDF文件的文档与md5文件进行比较。我需要让流忽略pdf中存在的创建时间戳。基本方法如下:
- 创建一个继承FileStream的类
- 添加一个构造函数,使用普通的文件流参数,并将Dictionary作为额外的参数,让它使用原始参数调用base(…),然后在你自己的构造函数中,将Dictionary存储在私有变量中。
- 仍然在构造函数中,遍历字典的键,并将最长的键字符串的长度保存在私有变量中。
- 覆盖
Read(byte[] buffer, int offset, int count)
,并实现它,以便它读取所需的长度,加上之前和之后(就文件而言,当然),最长字符串的长度。一旦你有了这个更长的范围,搜索并替换其中的字符串。在前后阅读的额外内容将确保捕获所有参数。更换后,请确保再次将其裁剪成原始要求的尺寸。 - 因为你的参数和数据实际上在长度上不匹配,你需要找到一种方法来解决文档读指针和给你的read函数的指针之间不可避免的不同步。
- 确保也覆盖
int ReadByte()
调用完全基于缓冲区的读取,所以它也捕获这些参数。
注意,因为你在处理字符串,你可能会有一些额外的复杂性,涉及到xml文件中的文本编码;如果是UTF-16,那么每个字符都是两个字节。就我个人而言,如果你知道预期的输入是什么,我会把编码作为参数给构造函数;这比在写入器内部为它添加一些混乱的检测要容易得多。
这是我为PDF读取编写的一个类,但它只是用相同长度的空字符串替换匹配。
http://sourceforge.net/p/lmsda/code/HEAD/tree/trunk/DokeosUpload/persistence/document/PDFFilterFileStream.cs你必须弄清楚如何解决你的指针设计问题,但是,万一读取指针在读取过程中被手动更改。你永远不知道xml解析器的内部是如何处理它的;他们可能偶尔会回头看以前的标签。
您可能需要提前从构造函数中对文件进行完整的扫描,并让它生成一个完整的列表,其中包含找到键的所有偏移,以及该位置上的键。这似乎是唯一的方法来可靠地调整请求的读指针到正确的实际偏移量在文件中为任何请求的随机访问读取。