如何使用lxml在XML元素名称中使用“:”?

时间:2012-05-02 15:19:19

标签: python lxml

如何使用lxml生成和解析XML,如下所示?

<s:Envelope xmlns:s="a" xmlns:a="http_//www.w3.org/2005/08/addressing">
....
</s:Envelope>

我当前交换:在解析和生成XML时,在元素名称中使用_,但这看起来很愚蠢。

1 个答案:

答案 0 :(得分:7)

目前尚不清楚你究竟在问什么,但也许这会有所帮助:

<s:Envelope>之类的元素正在使用XML名称空间前缀。这用于指示此文档中的s:Envelope属性是在a命名空间中定义的。

LXML表示在大括号中使用名称空间前缀的XML名称空间,例如:{a}Envelope。您的示例文档有点令人困惑,因为您还定义了a:名称空间前缀,因此:

  • a:Element相当于{http://www.w3.org/2005/08/addressing}Element
  • s:Element相当于{a}Element

许多LXML命令允许您提供命名空间前缀映射。例如,要使用XPATH在文档中查找Envelope元素,可以执行以下操作:

import lxml.etree as etree
doc = etree.parse('mydocument.xml')
envelope = doc.xpath('//s:Envelope',
  namespaces={'s': 'a'})

请注意,这完全等同于:

envelope = doc.xpath('//x:Envelope',
  namespaces={'x': 'a'})

即,名称空间前缀不必与源XML文档中使用的名称相匹配;只有绝对名称空间很重要。

您可以阅读有关LXML和命名空间here的更多信息。