在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中执行此操作。
答案 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元素,然后将它们全部串在一起并搜索结果,但是您遇到的问题是如何知道文档中最终找到的内容住。
如果您不关心它(例如,如果您只是数据挖掘)那么这可能是最快的解决方案。