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

我遇到了这个模块,它非常有用。 XML 转字典

于 2013-01-04T10:09:15.320 回答
1

您可以使用 xml.dom.minidom 解析 xml 字符串并提取元素以创建字典。这是一个minidom的例子

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 回答
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 回答