我正在接收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。有什么想法吗?
答案 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"