2

在 WordprocessingML(MS Word 文档保存的格式)中,是否可以轻松搜索文本?

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

为了存储句子"Module 1: Some Section Title",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 ”、“ odule 1: ”、“ Some Section Title ”。这种安排使得不可能搜索整个句子。有没有办法解决这个问题?

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

4

2 回答 2

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

于 2011-05-12T18:04:23.247 回答
0

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

不幸的是,我没有发现任何可以缓解这种情况的方法(openxml sdk、Aspose 等似乎基本上只是将 WordML xml 包装在一个薄薄的单板中)。

您可以对 ML 进行一些有限的预处理并解析出很多东西(比如所有那些 rsidRPr 元素等),但是解析出足够多的格式化元素以始终能够搜索文本仍然会很棘手。

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

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

于 2011-05-03T21:54:30.717 回答