如何替换 python 中单词 docx 中的整个 xml 元素,就好像它们是字符串一样

How can I replace whole xml elements in a word docx in python as if they were strings

我的word文档中有几个符号字体行没有被记录为文本。 当我使用 python-docx 查看底层 xml 时,我可以看到未打印的行如下所示:

<w:sym w:font="Symbol" w:char="F0B3"/>

但 python-docx 完全忽略 w:sym 标签。当我提取文本时,就好像它们根本不存在一样。这意味着我不能只找到并用正确的格式替换符号。在从我的文档中提取表格和文本之前,我需要能够替换它们。

如何将上面的树元素变成这样的 w:t 版本:

<w:t>≥</w:t>

我完全可以为整行替换设置字典。我只是不知道如何在不破坏 xml 文件的情况下做到这一点。

如果您对 python-docx 不满意,可以使用此 xsl 1.0:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"  
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  
  <!-- Identity template : copy all text nodes, elements and attributes -->   
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="w:sym[@w:font='Symbol' and @w:char='F0B3']">
    <w:t>≥</w:t>
  </xsl:template>
  
</xsl:stylesheet>

python-docx API 不支持此功能。您需要以其他方式编辑 XML。

python-docx 可以让您以 lxml.etree._Element object 的形式访问段落 XML 元素 (<w:p>) 然后您可以使用API 操纵其 children。基本思想是在找到 w:sym 元素的任何地方插入一个新的 <w:t> 元素,然后删除 w:sym 元素。

lxml.etree._Element API 文档位于:https://lxml.de/api/lxml.etree._Element-class.html。代码可能看起来像这样:

p = paragraph._p
for child_element in list(p):
    if child_element.tag != "w:sym":
        continue
    new_t_element = ...
    child_element.addprevious(new_t_element)
    p.remove(child_element)

还有一些细节需要解决,但希望这能给你一个追求的方向。解决了细节后,也许您可​​以在此处 post 您的解决方案。