0

次のような XML ファイルがあります。

<item>
  <global>

    <option id="123b25-1323-2f">
      <name>Bla</name>
      <number>0123987</number>
    </option>
    <option id="aeb12f-91b3-57">
      <name>Foo</name>
      <number>92309</number>
    </option>

    <section id="aeee72-0965-66">
      <name>alb</name>
      <number>0123987</number>
    </section>
    <section id="928374-11b3-51">
      <name>oof</name>
      <number>92309</number>
    </section>

  </global>
</item>

python2.7と適切なモジュールを使用して、オプションとセクションなどの辞書を作成する最良の方法は何ですか。
コード例:

root = XMLTree(xml) # xml ist file or string
global = root.getSubsection('global')
options = global.getItems('option')
sections = global.getItems('section')

print options

私はこのような出力を望みます:

=> {'id-123b25-1323-2f': {'name': 'Bla', 'number': '0123987'}, 'id-aeb12f-91b3-57': {'name': 'Foo', 'number': '92309'}}
4

4 に答える 4

1

ElementTreeは、非常に適切な標準ライブラリ モジュールです。ここに提案があります(Python 2.7):

from xml.etree import ElementTree as ET

def get_items(elements):
    D = {elem.get("id"): dict((child.tag, child.text) for child in elem) 
         for elem in elements}
    return D

tree = ET.parse("item.xml")
options = tree.findall(".//option")
sections = tree.findall(".//section")

print "options:"
print get_items(options)
print "sections:"
print get_items(sections)

出力:

options:
{'aeb12f-91b3-57': {'name': 'Foo', 'number': '92309'}, '123b25-1323-2f': {'name': 'Bla', 'number': '0123987'}}
sections:
{'928374-11b3-51': {'name': 'oof', 'number': '92309'}, 'aeee72-0965-66': {'name': 'alb', 'number': '0123987'}}
于 2013-01-05T10:05:14.150 に答える
1

私はこのモジュールに出会いましたが、とても役に立ちました。 XML から Dict

于 2013-01-04T10:09:15.320 に答える
1

xml.dom.minidom を使用して xml 文字列を解析し、要素を抽出して辞書を作成できます。これはミニドムの例です

from xml.dom.minidom import parseString
dom = parseString(data) #xml dom object from xml
def getItems(node): 
    """dom parser and xml generator"""
    return {node.getAttribute('id'): 
                 dict((e.nodeName, e.firstChild.data) 
                      for e in node.childNodes if e.nodeType == dom.ELEMENT_NODE)
            for node in node }

options = dom.getElementsByTagName('option')
sections = dom.getElementsByTagName('section')
getItems(options)
{u'aeb12f-91b3-57': {u'name': u'Foo', u'number': u'92309'}, u'123b25-1323-2f': {u'name': u'Bla', u'number': u'0123987'}}
getItems(sections)
{u'928374-11b3-51': {u'name': u'oof', u'number': u'92309'}, u'aeee72-0965-66': {u'name': u'alb', u'number': u'0123987'}}
于 2013-01-04T10:09:45.277 に答える
1
import lxml.etree as et

doc=et.fromstring(xml)

def getItems(doc,name):
    d={}
    for elem in doc.xpath('.//{0}'.format(name)):
        attr=elem.xpath('.//@id')[0]
        items=[(i.tag, i.text) for i in elem.xpath('.//*')]
        d[attr]={k:v for k,v in items}  
    return d
print getItems(doc,'option')
print getItems(doc,'section')

出力:

{'aeb12f-91b3-57': {'name': 'Foo', 'number': '92309'}, '123b25-1323-2f': {'name': 'Bla', 'number': '0123987'}}
{'928374-11b3-51': {'name': 'oof', 'number': '92309'}, 'aeee72-0965-66': {'name': 'alb', 'number': '0123987'}}
于 2013-01-04T11:43:35.063 に答える