如何替换 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 您的解决方案。
我的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 您的解决方案。