微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决尝试设置一个命名空间时获取多个命名空间

我试图在 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">

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。