2012-07-14 32 views
3

XML:獲取所有屬性的XML Python和使之成爲一本字典

<main> 
    <item name="item1" image="a"></item> 
    <item name="item2" image="b"></item> 
    <item name="item3" image="c"></item> 
    <item name="item4" image="d"></item> 
</main> 

的Python:

xmldoc = minidom.parse('blah.xml') 
itemlist = xmldoc.getElementsByTagName('item') 
for item in itemlist : 
    #####I want to make a dictionary of each item 

所以我會得到

{'name':'item1','image':'a'} 
{'name':'item2','image':'b'} 
{'name':'item3','image':'c'} 
{'name':'item4','image':'d'} 

有誰知道該怎麼辦這個?有沒有功能?

回答

4

下面的代碼將創建詞典(無需額外的庫):

dicts = [] 
for item in itemlist: 
    d = {}  
    for a in item.attributes.values(): 
     d[a.name] = a.value 
    dicts.append(d) 
print dicts 
1

使用this的Python食譜:

from xml2obj import xml2obj 

data = xml2obj(s)['item'] 

# data content: 
>>> [{image:u'a', name:u'item1'}, 
>>> {image:u'b', name:u'item2'}, 
>>> {image:u'c', name:u'item3'}, 
>>> {image:u'd', name:u'item4'}] 
0

在實際嘗試了這一點,就出現了錯誤的地方,但這應該讓你開始如果你不想使用其他答案之一。

from bs4 import BeautifulSoup 

xml = BeautifulSoup(''' 
<main> 
    <item name="item1" image="a"></item> 
    <item name="item2" image="b"></item> 
    <item name="item3" image="c"></item> 
    <item name="item4" image="d"></item> 
</main> 
''') 

item = xml.find_all('item') 

count = 0 
for snippet in item: 
    eval('attribute' + str(count) = {'name':item[count]['name'], 
            'image':item[count]['image']}) 
    count += 1 
0

這Python代碼將執行所需的任務,但是當你在你的例子輸出顯示輸出沒有排序。字典可以通過鍵進行訪問,但沒有排序。

from xml.etree import ElementTree 
treexml = ElementTree.parse('test.xml') 
for element in treexml.getiterator(): 
    dict_keys={} 
    if element.keys(): 
     for name, value in element.items(): 
      dict_keys[name]=value 
     print dict_keys 
+0

'getiterator'似乎有自3.2版以來已被棄用。你今天會推薦什麼? – 2018-02-28 13:48:11

1

我建議喜歡新xml.etree.ElementTree標準模塊的xml.dom.minidom。請嘗試以下操作:

import xml.etree.ElementTree as ET 

tree = ET.parse('test.xml') 
for element in tree.getiterator('item'): 
    print element.attrib 

它打印

{'image': 'a', 'name': 'item1'} 
{'image': 'b', 'name': 'item2'} 
{'image': 'c', 'name': 'item3'} 
{'image': 'd', 'name': 'item4'} 

這裏.getiterator('item')遍歷樹中的所有元素,並返回名爲item的元素。每個元素的.attrib是元素屬性的字典 - 這正是你想要的。

實際上,元素表現爲子元素列表。通過以上屬性是詞典中的項目,ElemenTree比Python方法更適合Python。

下面的代碼添加到上面的示例:

print '----------------' 
root = tree.getroot() 
ET.dump(root) 

print '----------------' 
print root.tag 
print root.attrib 
for elem in root: 
    print elem.tag, elem.attrib 

它打印:

---------------- 
<main> 
    <item image="a" name="item1" /> 
    <item image="b" name="item2" /> 
    <item image="c" name="item3" /> 
    <item image="d" name="item4" /> 
</main> 
---------------- 
main 
{} 
item {'image': 'a', 'name': 'item1'} 
item {'image': 'b', 'name': 'item2'} 
item {'image': 'c', 'name': 'item3'} 
item {'image': 'd', 'name': 'item4'} 
+0

'getiterator'似乎從版本3.2開始已被棄用。你今天會推薦什麼? – 2018-02-28 13:51:15

+0

@ tommy.carstensen答案與Python 2之前的2.7版本有關。 Python 3引入了許多接口更改,並且通過許多結構的迭代也是統一的(API)。後來這也被移植到Python 2.7。正如文檔所說,你應該使用所選元素的'.iter()' - 這裏使用'root = tree.getroot()'得到的'root'元素。 – pepr 2018-03-05 18:44:46

0

列表/字典解析版本的the accepted answer

dicts = [{a.name: a.value for a in item.attributes.values()} for item in itemlist] 
print dicts