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>

パイソン:

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は、要素属性の辞書です。これはまさにあなたが望むものです。

実際には、要素はサブ要素のリストとして動作します。上記の属性はディクショナリ内の項目であり、ElemenTree は DOM アプローチよりも 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

この 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

実際にこれを試してみると、どこかでエラーが発生しますが、他の回答のいずれかを使用したくない場合は、これで開始できます。

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 に答える