我一直在使用优秀的python-docx包来读取,修改和编写Microsoft Word文件。该包支持从每个段落中提取文本。它还允许访问段落a" run"一次,run是一组具有相同字体信息的字符。不幸的是,当您通过运行访问段落时,会丢失链接,因为包不支持链接。该软件包也不支持访问更改跟踪信息。
我的问题是我需要访问更改跟踪信息。或者,更具体地说,我需要将具有从一个文档指示的更改跟踪的段落复制到另一个文档。
我已尝试在XML级别执行此操作。例如,此代码段将file1.docx的内容附加到file2.docx:
from docx import Document
doc1 = Document("file1.docx")
doc2 = Document("file2.docx")
doc2.element.body.append(doc1.element.body)
doc2.save("file2-appended.docx")
当我尝试在Mac上打开文件以查找复杂文件时,我收到此错误:
但如果我点击OK,内容就在那里。对于非常简单的文件,操作也没有问题。
我错过了什么?
答案 0 :(得分:1)
.element
属性实际上是"内部"接口,应命名为._element
。在其他大多数地方我都把它命名为。你在那里得到的是文档部分的根元素。您可以通过以下方式查看它是什么:
print(doc2.element.xml)
该元素下面只有一个w:body
元素,这是doc2.element.body
时所得到的(.xml
也可以使用它,顺便说一句,如果你想检查那个元素)。
您的代码正在做的是在另一个w:body
元素的末尾附加一个body元素,从而形成无效的XML。 WordprocessingML词汇表对于哪个元素可以跟随另一个元素以及多少个等等非常严格。对我来说唯一的惊喜是它实际上有时适合你,我接受它:)
如果你想直接操作XML,这就是._element
属性的用途,你需要仔细考虑(复杂的)WordprocessingML XML Schema。
与您坚持使用已发布的API不同,一旦._element
(或.element
)出现在您的代码中,就没有安全网。
在体内,XML可以是与外部文档部分的关系,如图像和超链接。这些仅在它们出现的文档中有效。这可以解释为什么可以修复某些文件。