2012-06-27 32 views
15

有沒有辦法忽略elementtree.ElementTree中tage名稱中的XML名稱空間?Python:忽略elementtree.ElementTree中的xmlns

我嘗試打印所有technicalContact標籤:

for item in root.getiterator(tag='{http://www.example.com}technicalContact'): 
     print item.tag, item.text 

而我得到的東西,如:

{http://www.example.com}technicalContact [email protected] 

但我真正想要的是:

technicalContact [email protected] 

是否有辦法僅顯示後綴(sans xmlns),還是更好 - 在不明確聲明xmlns的情況下迭代元素?

+0

見我的回答下http://stackoverflow.com/a/25920989/2593383一個更一般解決方案 – nonagon

回答

8

您可以定義一個發電機,以便找到與合適的標籤名稱結尾的標籤通過你的元素樹遞歸搜索。例如,像這樣:

def get_element_by_tag(element, tag): 
    if element.tag.endswith(tag): 
     yield element 
    for child in element: 
     for g in get_element_by_tag(child, tag): 
      yield g 

這只是檢查與tag結束標記,即忽略任何領先的命名空間。然後,您可以在任何標籤遍歷你想如下:

for item in get_element_by_tag(elemettree, 'technicalContact'): 
    ... 

該發電機在行動:

>>> xml_str = """<root xmlns="http://www.example.com"> 
... <technicalContact>Test1</technicalContact> 
... <technicalContact>Test2</technicalContact> 
... </root> 
... """ 

xml_etree = etree.fromstring(xml_str) 

>>> for item in get_element_by_tag(xml_etree, 'technicalContact') 
...  print item.tag, item.text 
... 
{http://www.example.com}technicalContact Test1 
{http://www.example.com}technicalContact Test2 
+0

希望以上回答這個問題。我注意到的一個區別是,生成器示例中的'item'沒有'next'方法。不過,除此之外,它的行爲方式與'etree.getiterator'相同(類似?)。 – Chris

0

我總是最後使用類似

item.tag.split("}")[1][0:] 
+0

它沒有解決迭代器問題 - 我仍然需要遍歷整個標記名稱。 –

+0

我不知道任何python的xml處理程序。使用lxml,您可以在解析它之前在xml上使用xlst。 – lebox

+2

什麼是「[0:]」? – jadkik94