如何使用lxml
生成和解析XML,如下所示?
<s:Envelope xmlns:s="a" xmlns:a="http_//www.w3.org/2005/08/addressing">
....
</s:Envelope>
我当前交换:在解析和生成XML时,在元素名称中使用_,但这看起来很愚蠢。
答案 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的更多信息。