2009-12-13 82 views
0

我正在接收XML格式的數據包,每個數據包都帶有特定的documentRoot標籤,並且我想根據根標籤名稱委託專門的方法來處理這些數據包。通過使用更Python lxml.objectifylxml [.objectify] documentElement tagName

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

不過,我想簡化的東西(在代碼的其他部分,而不是在這裏):這個曾與xml.dom.minidom,像這樣。

問題是我不知道如何獲得「root.tagName」與lxml,最好是嚴格的lxml.objectify。有任何想法嗎?

回答

3

隨着lxml docs的幫助和迪爾()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) 
0

FWIW在Amara Bindery你可以這樣做:

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) 

,你會得到一個Python API來爲好,如:doc.html.head.title = u"Change HTML document title"

+0

我不打算編輯我​​的帖子的標題以接受你的答案,你知道的。但首先,我不會切換到我不想使用的東西,只是因爲你的自傳似乎支持它:P – Flavius 2009-12-13 18:46:43

+0

也許我不明白StackOverflow是如何工作的(畢竟我是新的),但是僅僅因爲「答案」已被「接受」而對線索作出另一個迴應是不恰當的呢?有一點可以幫助其他可能遲到的人?我希望這不是全部關於「Flavius」,因爲我的回答肯定不是。 也許他們是正確的comp.lang.python的StackOverflow是一個有問題的分叉。我會拒絕判斷,FWIW。 – 2009-12-19 22:57:35

+0

@Uche:事實:你先回答,然後我回答,然後我的回答被接受。在這方面,你的問題有些含糊。答案被接受後,你能否提出你的第一個答案?是的,當然,如果你真的相信你有更好的答案。你能否提供(你的)其他答覆?編輯原始答案可能會更好。無論何時接受答案,相關性都很重要; amara!= lxml。有一個討論論壇的元論壇;不在這裏。 – 2009-12-29 15:45:50