2010-06-23 103 views
3

所以我得處理一些XML,看起來像這樣:使lxml.objectify忽略xml命名空間?

<ns2:foobarResponse xmlns:ns2="http://api.example.com"> 
    <duration>206</duration> 
    <artist> 
    <tracks>...</tracks> 
    </artist> 
</ns2:foobarResponse> 

我發現LXML和它的objectify模塊,可以讓你在一個Python的方式遍歷XML文檔,像一本字典。
問題是:它使用了僞造的XML命名空間的每一次嘗試訪問一個元素,這樣的時刻:

from lxml import objectify 

tree = objectify.fromstring(xml) 
print tree.artist 
# ERROR: no such child: {http://api.example.com}artist 

它試圖與父命名空間訪問<artist>,但標籤不使用納秒。

任何想法如何解決這個問題?謝謝

回答

7

根據lxml.objectify documentation,屬性查找默認使用其父元素的名稱空間。

什麼你可能工作將是:如果你的孩子有一個非空的命名空間(「{http://foo/}藝術家」,例如)

這樣
print tree["{}artist"] 

的QName語法的工作,但不幸的是,它看起來像當前的源代碼將空名稱空間視爲名稱空間,因此所有objectify的查找善良將有助於用父命名空間替換空名稱空間,並且您運氣不佳。

這可能是一個bug(「{} artist」should work),或者是一個針對lxml人員的增強請求。

就目前而言,做的最好的事情大概是:

print tree.xpath("artist") 

這是我不清楚多少表現打你會採取在這裏使用XPath,但是這肯定的作品。

3

僅供參考:請注意,由於lxml 2.3,此功能與預期一致。

從lxml的更新日誌:

「 [...]

2.3(2011-02-06)功能的加入

  • 在尋找孩子,lxml.objectify需要'{}標記' 一個空的名稱空間,而不是父名稱空間。

[...]」

在行動:

>>> xml = """<ns2:foobarResponse xmlns:ns2="http://api.example.com"> 
... <duration>206</duration> 
... <artist> 
...  <tracks>...</tracks> 
... </artist> 
... </ns2:foobarResponse>""" 
>>> tree = objectify.fromstring(xml) 
>>> print tree['{}artist'] 
artist = None [ObjectifiedElement] 
    tracks = '...' [StringElement] 
>>>