尝试设置一个名称空间时获取多个名称空间

Getting multiple namespaces when trying to set one

我正在尝试在 PowerPoint 图表 XML 文件中设置命名空间,但这样做给了我两个命名空间。我找到的文档和资源使我相信最好将名称空间设置为属性。

这个函数:

from lxml.etree import Element, SubElement, QName

def function(graphic_frame):
    chart = graphic_frame.chart
    chart_xml = chart._element

    NS = 'http://schemas.microsoft.com/office/drawing/2015/06/chart'
    bracket_NS = "{" + NS + "}c16r2"
    etree.register_namespace('c16r2', NS)
    chart_xml.set(bracket_NS, NS)

给出这个结果:

<c:chartSpace 
xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart" 
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" 
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" 
xmlns:c16r2="http://schemas.microsoft.com/office/drawing/2015/06/chart" 
c16r2:c16r2="http://schemas.microsoft.com/office/drawing/2015/06/chart">

不需要“c16r2:c16r2”。

我觉得好像遗漏了一些明显的东西。任何指导都会有所帮助。

为什么需要命名空间?它不会仅仅因为它被注册就出现在每个元素中。它只会在元素或属性需要(使用)它时出现。

如果您添加一个元素或属性 使用 该名称空间(一旦注册),它的名称空间前缀映射将出现在您打印的 XML 中。这实际上就是您所做的,只是以一种令人困惑的方式。

让我们注册 c16r2 命名空间前缀,然后用它来添加一个 c16r2:foo 属性:

>>> chart_element = chart._element
>>> chart_element.xml
<c:chartSpace 
xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart"
...

>>> NS = 'http://schemas.microsoft.com/office/drawing/2015/06/chart'
>>> etree.register_namespace('c16r2', NS)
>>> chart_element.xml
<c:chartSpace 
xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart"
...  # --- no change ---

>>> foo_attr_clark_name = "{%s}%s" % (NS, "foo")
>>> chart_element.set(foo_attr_clark_name, "bar")
>>> chart_element.xml
<c:chartSpace 
xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart"
...
# --- registered namespace appears ---
xmlns:c16r2=http://schemas.microsoft.com/office/drawing/2015/06/chart
# --- because you've added element-or-attribute that needs it ---
c16r2:foo="bar">