【问题标题】:How do I create a namespaced element with lxml?如何使用 lxml 创建命名空间元素?
【发布时间】:2020-10-05 07:04:48
【问题描述】:

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

如果我只是尝试:

from lxml import etree

element = etree.Element("itunes:duration")

我明白了:

ValueError: Invalid tag name 'itunes:duration'

接下来我试了一下,离得更近了一点:

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"))

然而这导致了这个输出:

<ns0:duration xmlns:ns0="itunes"/>

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

【问题讨论】:

  • 您是否尝试阅读有关命名空间的 lxml 教程部分 lxml.de/tutorial.html#namespaces - 通过使用流行的搜索引擎搜索以下内容,您可能可以找到有关此主题的许多其他信息来源:lxml 命名空间
  • @barny 是的,我赚不到两美分。我希望有人已经这样做并且可以提供更简洁的代码 sn-p。

标签: python xml lxml xml-namespaces podcast


【解决方案1】:

尝试使用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"))

打印...

<itunes:duration xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"/>

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

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

【讨论】:

  • 这太棒了!您是否也碰巧知道是否有任何方法可以从中删除 xmlns:itunes 属性?
  • @soapergem - 不,我不这么认为。如果你剥离它,它就不再是namespace well formed。然而,一旦你开始组合元素来创建你的文档,命名空间声明在你序列化它时应该只出现一次。
猜你喜欢
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 2018-07-10
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多