在python中,如何将word docx中的整个xml元素替换为字符串

2024-09-30 22:21:13 发布

您现在位置:Python中文网/ 问答频道 /正文

“我的word文档”包含多个未记录为文本的符号字体行。 当我使用python docx查看底层xml时,我可以看到未打印的行如下所示:

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

但是pythondocx完全忽略了w:sym标记。好像我提取文本时它们根本不在那里。这意味着我不能仅仅找到并用正确的格式替换符号。我需要能够在从文档中提取表格和文本之前替换它们

如何将上面的树元素转换为如下w:t版本:

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

我完全可以为全行替换设置词典。我就是不知道如何在不破坏xml文件的情况下完成它


Tags: 文档文本字体符号xmlsymbolwordfont
2条回答

这是不受python-docxAPI支持的。您需要以另一种方式编辑XML

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

lxml.etree._ElementAPI文档在这里: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)

还有一些细节需要解决,但希望这能给你一个追求的方向。一旦你解决了细节问题,也许你可以在这里发布你的解决方案

如果您在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>

相关问题 更多 >