Python 3.x 有没有办法调试和/或验证由python docx生成的Microsoft Word文档XML?

Python 3.x 有没有办法调试和/或验证由python docx生成的Microsoft Word文档XML?,python-3.x,xml,ms-word,docx,python-docx,Python 3.x,Xml,Ms Word,Docx,Python Docx,我正在使用PythonDocx库构建一个用于生成MicrosoftWord文档报告的简单框架。有时,在生成文档时,我会遇到一个问题,其中docx文件是由python docx成功生成的,但随后该docx文件将无法在Microsoft Word中打开,并显示如下错误消息: 通过一步一步地处理我的代码—逐步将越来越多的内容插入python docx文档,然后在每次添加内容后尝试打开生成的docx文件—我能够识别导致错误的代码。事实证明,错误是在我尝试使用以下代码插入空数据帧时引起的: def ins

我正在使用PythonDocx库构建一个用于生成MicrosoftWord文档报告的简单框架。有时,在生成文档时,我会遇到一个问题,其中docx文件是由python docx成功生成的,但随后该docx文件将无法在Microsoft Word中打开,并显示如下错误消息:

通过一步一步地处理我的代码—逐步将越来越多的内容插入python docx文档,然后在每次添加内容后尝试打开生成的docx文件—我能够识别导致错误的代码。事实证明,错误是在我尝试使用以下代码插入空数据帧时引起的:

def insert_as_table(df: pd.DataFrame, document: Document) -> Document:

    # compute parameters
    n_rows = len(df) + 1
    n_cols = len(df.columns)

    # create table object
    table = document.add_table(rows=n_rows, cols=n_cols)

    # fill header cells with text
    for header_cell, col in zip(table.rows[0].cells, df.columns):
        header_cell.text = str(col)

    # fill cells with strings
    for i, row in df.iterrows():
        for table_cell, (j, data) in zip(table.rows[i + 1].cells, row.iteritems()):
            table_cell.text = str(data)

    return document
我的解决方案是添加输入验证—在尝试插入数据框之前检查数据框是否为空:

def insert_as_table(df: pd.DataFrame, document: Document) -> Document:

    if df.empty:
        raise ValueError('df is empty. Cannot insert an empty dataframe as a table.')

    etc...

虽然这样做有效,但bug查找过程会引出我的问题:是否有办法调试和/或验证由python docx生成的Microsoft Word XML代码?关于验证,是否有一种方法可以验证由python docx生成的docx文件是否有效,并且能够由Microsoft Word打开(而实际上不必使用Word打开)?关于调试,是否有一种方法可以查看和调试docx XML代码,以确定问题所在的位置(并可能获得一些关于在Python代码中生成问题的线索)?这样的工具或方法可能会在我上面描述的bug搜索中为我节省大量的时间,并且可能在将来也会为我节省时间。非常感谢您的时间和想法。

您可能知道,
.docx
文件是符合开放式打包约定(OPC)的Zip归档文件。用OPC术语来说,这样的归档文件代表一个包,其中的(主)文件分别代表一个部分

像图像这样的文件是二进制部分,但大多数部分是XML文档。这些XML部分的有效内容由规范附带的一个或多个XML架构(.xsd)文件指定。这些文件位于python docx GitHub存储库的
/ref/xsd/
文件夹中

这些可用于单独验证零件。由于典型的Word文件主要是
document.xml
部分,因此最有效的方法可能是验证该文件

可以使用
pythondocx
使用的
lxml
库进行验证。有关该步骤,请参阅

这肯定会捕获模式无效的包部分,但我希望它无法捕获所有可能的XML文档,这些文档在加载到Word时会导致所谓的“修复错误”


不过,这可能值得一试。我很想知道它是否捕捉到了您上面的错误,我希望这是一个零行零列的表。

这是一个非常有用的信息,肯定帮助我找到了正确的方向。老实说,我不知道.docx文件实际上是一个Zip存档!我已经朝着我的目标取得了一些进展,但我还没有完全达到目标,因为当我尝试验证
文档时。_element.xml
针对.xsd文件,我收到一个
etree.XMLSyntaxError
声明
元素{http://schemas.openxmlformats.org/wordprocessingml/2006/main}文档“:没有可用于验证根目录的匹配全局声明。(,第0行)
。也许我遗漏了什么。是的,我认为您无法验证
文档生成的字符串。_element.xml
;如果要使用
pythondocx
导航包,则需要直接转到部件的字节,如
document.part.blob
。这可能仍然有问题,但这就是我下一步要尝试的。此外,您还需要将
wml.xsd
模式文件加载到某个地方,我希望在那里可以找到
元素定义。感谢您提供有关wml.xsd模式的提示。之后,我通过为
名称空间=”添加一个本地
schemaLocation=“xml.xsd”
稍微调整了该文件http://www.w3.org/XML/1998/namespace“
import,一旦我从文档xml中删除了一个有问题的元素,
mc:Ignorable=“w14 wp14”
,我就能够根据它验证文档xml。最后,事实证明,包含零行零列表的文档将根据wml.xsd模式成功验证。没有提出例外情况。所以我想在尝试插入数据帧之前,我会继续验证这些数据帧。再次感谢!