使用 python-docx,如何关联 XML 命名空间前缀?

Using python-docx, how can I associate an XML namespace prefix?

我目前正在尝试使用 python-docx 库向 word 文档添加一个复选框。我已将复选框 XML 缩小为两个可能的选项,第一个来自评估现有文档中的 word/document.xml 文件,第二个来自 XML 架构。尝试将 XML 元素插入简单文档时收到错误消息; "lxml.etree.XMLSyntaxError: Namespace prefix xsd on complexType is not defined".

这是我目前正在尝试的(使用架构中的 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 对象以及方式之后,这对我来说是有意义的它们已被处理 - 我无法用这个错误对其进行测试。

感谢任何帮助! 谢谢!

啊,好的,你的评论说明了一切。 MS Word 2003 XML 格式与 MS Word 2007 格式不同(顺便说一下,后者本质上是 XML 并且不需要转换)。

要查看 XML Word 2007 或更高版本的 .docx 文件,您只需解压缩它(它是一个 Zip 存档)。您可能需要先添加 .zip 扩展名,具体取决于您使用的解压缩工具。您会对结果树中 document.xml 文件中的 XML 感兴趣。我想您会发现书签显示为 <w:bookmarkStart><w:bookmarkEnd> 元素对,不需要对 python-docx.

的内置名称空间添加任何内容

有关更多详细信息和示例,请参阅此 GitHub 问题:github.com/python-openxml/python-docx/issues/403.