我目前正在尝试使用python-docx库为word文档添加一个复选框。我已经将复选框XML缩小为两个可能的选项,第一个是从现有doc评估word / document.xml文件,第二个是从XML Schema评估。当尝试将XML元素插入到简单文档中时,我收到错误; “lxml.etree.XMLSyntaxError:未定义complexType上的命名空间前缀xsd”。
这就是我目前正在尝试的(使用Schema中的XML):
def word_docs(emails):
cbox = parse_xml('<xsd:complexType name="CT_FFCheckBox"><xsd:sequence> \
<xsd:choice><xsd:element name="size"type="CT_HpsMeasure"/> \
<xsd:element name="sizeAuto" type="CT_OnOff"/></xsd:choice> \
<xsd:element name="default" type="CT_OnOff" minOccurs="0"/> \
<xsd:element name="checked" type="CT_OnOff" minOccurs="0"/> \
</xsd:sequence></xsd:complexType>')
doc = Document()
title = doc.add_heading("Document", 0)
table = doc.add_table(rows = 1, cols = 4)
table.style = 'TableGrid'
row = table.rows[0]
row.cells[0].text = "Test"
merged = (row.cells[1].merge(row.cells[2]))
merged._tc._add_p()
....
以下是从现有文档中提取的XML:
<w:tc>
<w:tcPr>
<w:tcW w:w="4788" w:type="dxa"/>
</w:tcPr>
<w:p wsp:rsidR="00834643" wsp:rsidRPr="00834643" wsp:rsidRDefault="00F12FD5" wsp:rsidP="00834643">
<w:pPr>
<w:spacing w:after="0" w:line="240" w:line-rule="auto"/>
</w:pPr>
<w:r>
<w:fldChar w:fldCharType="begin">
<w:fldData xml:space="preserve">/////2UAAAAUAAYAQwBoAGUAYwBrADEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</w:fldData>
</w:fldChar>
</w:r>
<aml:annotation aml:id="1" w:type="Word.Bookmark.Start" w:name="Check2"/>
<w:r>
<w:instrText> FORMCHECKBOX </w:instrText>
</w:r>
<w:r>
<w:fldChar w:fldCharType="end"/>
</w:r>
<aml:annotation aml:id="1" w:type="Word.Bookmark.End"/>
</w:p>
我已经能够手动将名称空间xmlns:xsd="http://www.w3.org/2001/XMLSchema"
手动添加到文档中,它似乎正确打开,我只是不确定如何以pythonic方式执行此操作以自动执行该过程。
通过python-docx进行的XML对象操作可能不正确,但在比较XML格式和python-docx对象及其处理方式之后,这对我来说是有意义的 - 我无法用这个错误测试它
任何帮助表示赞赏! 谢谢!
答案 0 :(得分:1)
啊,好的,你的评论解释了。 MS Word 2003 XML格式与MS Word 2007格式不同(顺便说一句,它本质上是XML并且不需要转换)。
要查看Word 2007或更高版本.docx文件的XML,只需将其解压缩(它是Zip存档)。您可能需要先添加.zip扩展名,具体取决于您用于解压缩的工具。您将对结果树中document.xml文件中的XML感兴趣。我认为您会发现书签显示为<w:bookmarkStart>
和<w:bookmarkEnd>
元素对,不需要添加python-docx
的内置命名空间。
有关更多详细信息和示例,请参阅此GitHub问题:github.com/python-openxml/python-docx/issues/403。