6

XML:

<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

6 回答 6

8

以下代码将创建字典(不需要额外的库):

dicts = []
for item in itemlist:
    d = {}    
    for a in item.attributes.values():
        d[a.name] = a.value
    dicts.append(d)
print dicts
于 2012-07-14T16:46:48.880 回答
6

我建议更喜欢较新的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是元素属性的字典——这正是你想要的。

实际上,元素表现为子元素列表。由于上述属性是字典中的项目,因此与 DOM 方法相比,ElemenTree 更适合 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'}
于 2012-07-14T17:08:24.493 回答
1

使用这个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'}]
于 2012-07-14T16:45:08.300 回答
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
于 2012-07-14T16:48:11.980 回答
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
于 2012-07-14T16:53:17.980 回答
0

已接受答案的列表/字典理解版本:

dicts = [{a.name: a.value for a in item.attributes.values()} for item in itemlist]
print dicts
于 2017-11-16T15:08:00.263 回答