lxml [.objectify] documentElement tagName

时间:2009-12-13 14:16:04

标签: python xml lxml

我正在接收XML格式的数据包,每个数据包都有一个特定的documentRoot标签,我想根据根标签名称委托专门的方法来处理这些数据包。这适用于xml.dom.minidom,如下所示:

dom = minidom.parseString(the_data)
root = dom.documentElement
deleg = getattr(self,'elem_' + str(root.tagName))
deleg(dom)

但是,我想通过使用更多pythonic lxml.objectify来简化(在代码的其他部分,而不是这里)。

问题是我不知道怎么用lxml获取“root.tagName”,最好是lxml.objectify。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

lxml docs和dir()built_in的帮助下,我设法产生了这个:

>>> from lxml import objectify
>>> import StringIO
>>> tree = objectify.parse(StringIO.StringIO('<parent><child>Billy</child><child>Bob</child></parent>'))
>>> root = tree.getroot()
>>> root.tag
'parent'
>>> [(foo.tag, foo.text) for foo in root.getchildren()]
[('child', 'Billy'), ('child', 'Bob')]
>>>

看起来你需要像

这样的东西
deleg = getattr(self,'elem_' + str(root.tag))
deleg(tree)

答案 1 :(得分:0)

Amara Bindery中的FWIW您可以执行以下操作:

from amara import bindery
doc = bindery.parse(the_data)
top_elem = doc.xml_elements.next()
deleg = getattr(self, 'elem_' + str(top_elem.xml_qname))
deleg(doc)

你也得到了一个Pythonic API,例如:doc.html.head.title = u"Change HTML document title"