如何在WordprocessingML中搜索/替换文本

时间:2011-05-03 14:36:29

标签: ms-word wordprocessingml

在WordprocessingML(MS Word文档保存的格式)中,无论如何都可以轻松搜索文本?

我遇到的主要问题是WordprocessingML格式将每个段落分解为“运行”,例如:

要存储句子“模块1:某些部分标题”,WordprocessingML指定XML标记为:

  <w:p w:rsidR="00F9529C" w:rsidRDefault="00F9529C" w:rsidP="00F9529C">
   <w:pPr>
    <w:pStyle w:val="Heading1_5019"/>
   </w:pPr>
   <w:bookmarkStart w:id="0" w:name="_Toc247333659"/>
   <w:r>
    <w:t>M</w:t>
   </w:r>
   <w:r w:rsidRPr="007D2739">
    <w:t xml:space="preserve">odule 1: </w:t>
   </w:r>
   <w:r>
    <w:t>Some Section Title</w:t>
   </w:r>
   <w:bookmarkEnd w:id="0"/>
  </w:p>

正如您所看到的,句子分为“ M ”,“模块1:”,“某些章节标题”。这种安排使得无法从整体上搜索句子。无论如何要解决这个问题吗?

为了澄清,我正在尝试使用DomDocument在PHP中执行此操作。

2 个答案:

答案 0 :(得分:1)

我编写了一些示例代码,演示如何在Open XML WordprocessingML文档中搜索和替换文本。我的方法是:一旦找到包含需要替换的文本的段落,就可以将段落中的所有运行分解为单个字符的运行。然后,可以直接找到与搜索字符串匹配的连续运行集。然后,您可以使用替换文本创建新运行,然后删除与搜索字符串匹配的单个字符运行。我使用XML DOM(使用System.Xml.XmlDocument)实现了这一点。您可以在博文Search and Replace Text in an Open XML WordprocessingML document中找到示例代码。另外,我录制了一个简短的屏幕演示,显示算法的工作原理:http://www.youtube.com/watch?v=w128hJUu3GM

答案 1 :(得分:0)

是的,这就是直接使用WordML的痛苦,比如使用对象模型这个词。

不幸的是,我发现没有什么可以减轻的(openxml sdk,Aspose等似乎只是将WordML xml包装在一个薄的单板中)。

你可以在ML上做一些有限的预处理并解决很多东西(比如所有那些rsidRPr元素等),但解决足够的格式化元素以始终能够搜索到它仍然很棘手文本。

或者,您可以使用XPATH提取w:t元素,然后将它们全部串在一起并搜索结果,但是您遇到的问题是如何知道文档中最终找到的内容住。

如果您不关心它(例如,如果您只是数据挖掘)那么这可能是最快的解决方案。