如何在跳过 xmlns 的同时插入带有命名空间的 lxml 标记?

How do you insert a lxml tag with namespace while skipping xmlns?

我正在尝试使用 python-docx 编写我的 python 脚本以将方程式添加到 docx 文件。由于 python-docx 尚不支持,因此我需要直接使用 lxml 修改 OOXML。我需要添加一些标签,所以结果 XML 看起来像这样:

<m:r>
    <m:t>(5−x)</m:t>
</m:r>

我无法创建新的裸体 <m:r> 使用 lxml 的节点。使用类似下面的代码

new_node = etree.Element('{m}r', nsmap={'m': ''})

给我一个 <m:r xmlns:m="m"> 节点,除了我不需要 xmlns 部分。 (python-docx 为我处理剩余的 XML 操作,如果 xmlns 在那里,docx 文件实际上不会被 MS Word 识别。)有没有办法制作一个裸体 <m:r> 节点?

python-docx 知道 "m": "http://schemas.openxmlformats.org/officeDocument/2006/math" 名称空间前缀映射:https://github.com/python-openxml/python-docx/blob/master/docx/oxml/ns.py#L18

因此您可以使用 python-docx 内部构件来创建这样的元素:

from docx.oxml import OxmlElement

r = OxmlElement("m:r")

然后您可以像使用任何其他 lxml 元素一样使用该元素,例如将其作为其他元素的子元素附加或插入。