替换文本,在平时很简单的问题,如果通过wordProcessingML操作,可能就变成word操作中最复杂的问题了。

因为字体、拼写检测等细微的差别,word中在一起的字符串,转到xml时有可能会封装到几个<w:r>中。这就给替换带来很大难度,使原本简单的问题变的复杂。

如:[pr:test/]有可能会被分解到三个<w:r>,还可能更多。最多会分散到n!个<w:r>,n是标记包含的字符数。

这就给找到匹配增加了难度,也很难保留原来的word格式。
   为了实现Doc的随机读写,只能用xpath,下面是[pr:test/]在word xml中的一种情况

解析WordprocessingML(一)查找和替换<w:r>
解析WordprocessingML(一)查找和替换        
<w:rPr>
解析WordprocessingML(一)查找和替换            
<w:rFonts w:ascii="新宋体" w:fareast="新宋体"/>
解析WordprocessingML(一)查找和替换            
<wx:font wx:val="新宋体" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint"/>
解析WordprocessingML(一)查找和替换            
<w:noProof/>
解析WordprocessingML(一)查找和替换            
<w:color w:val="A31515"/>
解析WordprocessingML(一)查找和替换            
<w:kern w:val="0"/>
解析WordprocessingML(一)查找和替换            
<w:sz w:val="18"/>
解析WordprocessingML(一)查找和替换            
<w:sz-cs w:val="18"/>
解析WordprocessingML(一)查找和替换        
</w:rPr>
解析WordprocessingML(一)查找和替换        
<w:t>[pr</w:t>
解析WordprocessingML(一)查找和替换    
</w:r>
解析WordprocessingML(一)查找和替换    
<w:r>
解析WordprocessingML(一)查找和替换        
<w:rPr>
解析WordprocessingML(一)查找和替换            
<w:rFonts w:ascii="新宋体" w:fareast="新宋体" w:hint="fareast"/>
解析WordprocessingML(一)查找和替换            
<wx:font wx:val="新宋体" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint"/>
解析WordprocessingML(一)查找和替换            
<w:noProof/>
解析WordprocessingML(一)查找和替换            
<w:color w:val="A31515"/>
解析WordprocessingML(一)查找和替换            
<w:kern w:val="0"/>
解析WordprocessingML(一)查找和替换            
<w:sz w:val="18"/>
解析WordprocessingML(一)查找和替换            
<w:sz-cs w:val="18"/>
解析WordprocessingML(一)查找和替换        
</w:rPr>
解析WordprocessingML(一)查找和替换        
<w:t>:</w:t>
解析WordprocessingML(一)查找和替换    
</w:r>
解析WordprocessingML(一)查找和替换    
<w:r>
解析WordprocessingML(一)查找和替换        
<w:rPr>
解析WordprocessingML(一)查找和替换            
<w:rFonts w:ascii="新宋体" w:fareast="新宋体"/>
解析WordprocessingML(一)查找和替换            
<wx:font wx:val="新宋体" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint"/>
解析WordprocessingML(一)查找和替换            
<w:noProof/>
解析WordprocessingML(一)查找和替换            
<w:color w:val="A31515"/>
解析WordprocessingML(一)查找和替换            
<w:kern w:val="0"/>
解析WordprocessingML(一)查找和替换            
<w:sz w:val="18"/>
解析WordprocessingML(一)查找和替换            
<w:sz-cs w:val="18"/>
解析WordprocessingML(一)查找和替换        
</w:rPr>
解析WordprocessingML(一)查找和替换        
<w:t>test/]</w:t>
解析WordprocessingML(一)查找和替换    
</w:r>
解析WordprocessingML(一)查找和替换

 

我到目前想到了三种解决方案:

第一种最快,但是他只能解决标记位于一个<w:r>中的情况:

解析WordprocessingML(一)查找和替换public string ReplaceMarker(MarkerValueCollection mvc,bool isVerify)
 

因为假设标记位于是连续的,所以把xml当作纯文本,用正则表达式替换就可以了。
   第二中方案,可以解决段落中含有[],[/],[[pr:test/]/]的情况,标记中的个字符可以分散到任意个<w:r>,但是要求段中不能包含不匹配的[]

   思路是:一次仅替换一个标记一次。因为假定标记成对出现,可以根据其实标记的位置,把属于同一个标记的各个<w:r>节点入栈,并且只保留栈顶的节点,把其他节点的值放到栈顶节点,删除其他节点。这样就把标记规范化了,即把分散到多个的<w:r>的标记合并到一个<w:r>

   第三种解决方案,目前似乎可以解决上面所有的问题。在包含“大幅度d[][[pr:test/]sfsad[][[pr:test1/]/][[pr:test/] test1dfdfd的的[pr:tesdfd1/]”的word文本中可以正确识别标记。

解析WordprocessingML(一)查找和替换 public XmlNode ReplaceMarker(XmlNode paragraph, CommonMarker cmarker, string value)
   

思路:思路和第二中类似,都是先规范标记,把分散到多个的<w:r>的标记合并到一个<w:r>。不同的是对包含标记的段落执行逐字符匹配,如果匹配开始标记,则入栈,碰到结束标记则出栈,解析栈中的节点。

调整后的xml是:

  

 

 

替换中出现的难点是:

1   尽可能的保留word格式,如果只保留段格式,第一中方案就可以了,后两种只是为了尽可能保留段内文本的word格式,单仍有破坏(这是不可能避免的,最小化的破坏格式)。

2  word中抽出的节点,被修改后还能放到原来的位置,这就使功能强大的正则很难使用。

总:第三种是比较好的解决替换的方法,不知道大家还有什么好思路?我已经为它头疼两周了,一直找不到更好的算法。
第三种方法是刚想到的,我现在觉的还行,有人有更好的解决方式,一定要留言啊

 

解析WordprocessingML(一)查找和替换

http://www.cnblogs.com/bluewater/admin/EditPosts.aspx?postid=627710

解析WordprocessingML(三)解析WordMl的基本方法和途径(a

http://www.cnblogs.com/bluewater/archive/2007/03/02/661824.html

解析WordprocessingML(三)解析WordMl的基本方法和途径(b

http://www.cnblogs.com/bluewater/archive/2007/03/02/661885.html

解析WordprocessingML(四)转换到Html格式

 

相关文章:

  • 2022-12-23
  • 2021-06-20
  • 2022-02-09
  • 2022-12-23
  • 2022-01-24
  • 2022-01-07
  • 2021-12-31
  • 2022-01-13
猜你喜欢
  • 2021-05-14
  • 2021-06-10
  • 2021-12-31
  • 2021-12-12
  • 2021-04-30
  • 2022-01-29
  • 2021-12-08
相关资源
相似解决方案