.net 如何搜索和替换OpenXML文档中出现的所有字符串

.net 如何搜索和替换OpenXML文档中出现的所有字符串,.net,replace,openxml,docx,.net,Replace,Openxml,Docx,我有一个.docx文档,其中包含需要用值替换的子字符串。 我的问题是,当通过OpenXML读取.docx文件的内容时,单词会被拆分为不同的Run/文本。 我只需要替换所有出现的子字符串 给定键值对[(k1,v1)、(k2,v2)、(k3,v3)] Docx输入被视为字符串(不知道Docx格式生成的xml元素) 所需输出 "[v1]\t[v2]\n\t[v3]" 像这样的文档的问题是,我看到OpenXML将[k1]截断成[,],k1]成不同的xml元素 代码 private

我有一个
.docx
文档,其中包含需要用值替换的子字符串。 我的问题是,当通过
OpenXML
读取
.docx
文件的内容时,单词会被拆分为不同的
Run
/
文本。
我只需要替换所有出现的子字符串

给定键值对
[(k1,v1)、(k2,v2)、(k3,v3)]

Docx输入被视为字符串(不知道Docx格式生成的xml元素)

所需输出

"[v1]\t[v2]\n\t[v3]"
像这样的文档的问题是,我看到
OpenXML
[k1]
截断成
[,],k1]
成不同的xml元素

代码

private Stream ReplaceInDocx(Dictionary<string, string> map, Stream templateStream) {
            var memorystream = new MemoryStream();

            templateStream.Seek(0, SeekOrigin.Begin);
            using (WordprocessingDocument doc = WordprocessingDocument.Open(templateStream, true)) {

                using (StreamReader reader = new StreamReader(doc.MainDocumentPart.GetStream())) {
                    var payload = reader.ReadToEnd();

                    var result = Enumerable.Aggregate(map,
                        payload,
                        (acc, field) => acc.Replace($"[{field.Key}]", field.Value));
                    using (var writer = new StreamWriter(memorystream)) {
                        writer.Write(result);
                    }

                }
                memorystream.Seek(0, SeekOrigin.Begin);
                return memorystream;
            }
        }
private Stream ReplaceInDocx(字典映射,流模板流){
var memorystream=新的memorystream();
templateStream.Seek(0,SeekOrigin.Begin);
使用(WordprocessingDocument doc=WordprocessingDocument.Open(templateStream,true)){
使用(StreamReader=newstreamreader(doc.MainDocumentPart.GetStream()){
var payload=reader.ReadToEnd();
var结果=可枚举的聚合(映射,
有效载荷,
(acc,field)=>acc.Replace($“[{field.Key}]”,field.Value));
使用(var writer=newstreamwriter(memorystream)){
写(结果);
}
}
memorystream.Seek(0,SeekOrigin.Begin);
返回内存流;
}
}
private Stream ReplaceInDocx(Dictionary<string, string> map, Stream templateStream) {
            var memorystream = new MemoryStream();

            templateStream.Seek(0, SeekOrigin.Begin);
            using (WordprocessingDocument doc = WordprocessingDocument.Open(templateStream, true)) {

                using (StreamReader reader = new StreamReader(doc.MainDocumentPart.GetStream())) {
                    var payload = reader.ReadToEnd();

                    var result = Enumerable.Aggregate(map,
                        payload,
                        (acc, field) => acc.Replace($"[{field.Key}]", field.Value));
                    using (var writer = new StreamWriter(memorystream)) {
                        writer.Write(result);
                    }

                }
                memorystream.Seek(0, SeekOrigin.Begin);
                return memorystream;
            }
        }