python - 使用 python-pptx 操作 PowerPoint XML 时查找子元素是否存在
问题描述
在使用 python-pptx 将 Markdown 转换为 PowerPoint 的 md2pptx 中,我实现了一些操作 XML 树的函数。
在一些地方,我需要找到一个子元素(如果存在)——如果不存在则创建它。
我有一种相当老套的方式来搜索这个元素。我宁愿有一个体面的方式。
那么,有人可以向我发布搜索子元素存在的“正确”方式吗?
这个问题可能有一个更通用的版本 - 如何在 python-pptx 的上下文中操作 XML。我也可以为此使用参考。(是的,我可以阅读 python-pptx 代码并且经常这样做 - 但概要会帮助我正确理解它。)
解决方案
使用 XPath 完成这项工作几乎总是正确的答案。
例如,如果您想获取a:fld
段落的所有子元素来实现与文本字段有关的操作:
# --- get <a:p> XML element of paragraph ---
p = paragraph._p
# --- use XPath to get all the `<a:fld>` child elements ---
flds = p.xpath("./a:fld")
# --- do something with them ---
for fld in flds:
do_fieldy_thing(fld)
调用的结果是与作为其参数提供的 XPath 表达式.xpath()
匹配的零个或多个项目的列表。str
如果只能有零个或一个结果,则通常像这样处理它:
if flds:
do_fieldy_thing(flds[0])
当“起始”元素(p
在这种情况下)不是定义的oxml
元素时,就会出现复杂情况。是在每个 XML 元素的基类“之上”oxml
添加的自定义元素类层。这些自定义元素类提供了一些便利服务,特别是允许您使用它们的命名空间前缀指定元素(如本例所示)。python-pptx
lxml.etree._Element
"a:fld"
并非所有元素python-pptx
都有自定义元素类,只有那些我们通过 API 以某种方式操作的元素。您从python-pptx
对象(paragraph._p
如上)获得的任何元素都将是 oxml 元素,但.xpath()
调用返回的元素很可能不会是(否则您将习惯于python-pptx
获取它们)。不是oxml 元素的元素是普通实例lxml.etree._Element
。
实例上的.xpath()
实现lxml.etree._Element
需要使用所谓的“克拉克名称”,看起来像:"{http://schemas.openxmlformats.org/drawingml/2006/main}fld"
而不是"a:fld"
.
您可以使用以下函数从以命名空间为前缀的标记名称创建 Clark 名称pptx.oxml.ns.qn()
:
>>> from pptx.oxml.ns import qn
>>> qn("a:fld")
'{http://schemas.openxmlformats.org/drawingml/2006/main}fld'
推荐阅读
- php - CentOS + PHP:shell_exec 限制的进程
- php - Plesk PHP move_uploaded_file() Live 不工作
- python - 如何清理可选的 Django 表单字段
- javascript - JavaScript - 删除数组的最后一个索引
- excel - 使用双字母列时出现 1004 错误(适用于单字母)
- cgal - 构建 CGAL 示例 Triangulation_2 时出错
- ios - 如何在 swift iOS 中的 collectionview 中创建多行标签?
- symfony - Symfony Encore - Webpack 和 UglifyJs
- c# - AWS Cognito OAuth:登录请求失败
- python - Python 套接字在其他计算机上超时。超时错误:[WinError 10060]