如何使用 lxml 创建命名空间元素?

soa*_*gem 3 python xml podcast lxml xml-namespaces

我正在使用 lxml 生成最终用作播客的 RSS 提要。这意味着我需要添加命名空间元素,例如<itunes:duration><itunes:subtitle>。但我在尝试弄清楚如何使用 lxml 动态创建此类元素时遇到了很多麻烦。

如果我简单地尝试:

from lxml import etree

element = etree.Element("itunes:duration")
Run Code Online (Sandbox Code Playgroud)

我明白了:

ValueError: Invalid tag name 'itunes:duration'
Run Code Online (Sandbox Code Playgroud)

接下来我尝试了这个并且更接近了:

from lxml import etree

etree.register_namespace("itunes", "http://www.itunes.com/dtds/podcast-1.0.dtd")
element = etree.Element("{itunes}duration")
print(etree.tostring(element).decode("utf-8"))
Run Code Online (Sandbox Code Playgroud)

然而,这导致了这个输出:

<ns0:duration xmlns:ns0="itunes"/>
Run Code Online (Sandbox Code Playgroud)

因此,虽然这比例外要好,但​​它显然仍然是不对的。如何创建itunes:标签名称中带有前缀的元素?

Dan*_*ley 7

尝试使用etree.QName()...

from lxml import etree

etree.register_namespace("itunes", "http://www.itunes.com/dtds/podcast-1.0.dtd")
element = etree.Element(etree.QName("http://www.itunes.com/dtds/podcast-1.0.dtd", "duration"))
print(etree.tostring(element).decode("utf-8"))
Run Code Online (Sandbox Code Playgroud)

印刷...

<itunes:duration xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"/>
Run Code Online (Sandbox Code Playgroud)

您也可以只使用克拉克符号......

element = etree.Element("{http://www.itunes.com/dtds/podcast-1.0.dtd}duration")
Run Code Online (Sandbox Code Playgroud)