1

我想使用此代码 xml 文件从 xml 文件中提取属性:

xml= "<graphics type='xxx' port=’0’ autoport='xxx' listen='0.0.0.0'>
  <listen type='address' address='0.0.0.0'/>
</graphics>"

代码是:

def xml_to_dict(xml):  
      d={}   
      if xmlk.text:
         d[xmlk.tag] = xmlk.text  
      else:
         d[xmlk.tag] = {}   
     children = xmlk.getchildren()   
     if children:
         d[xmlk.tag] = map(xml_to_dict, children)  
         return d

     xml_to_dict(xyz) Output: {'graphics': [{'listen': {}}]}

我试过 dmlk,attrib 而不是标签,但无济于事。有谁知道这个

4

3 回答 3

0

我建议使用 lxml,但以下代码适用于 lxml 或 ElementTree

您还需要稍微调整一下算法:

from xml.etree import ElementTree as etree
tree = etree.fromstring(xml)

def xml_to_dict(tree):  
  d={}   
  if tree.text:
     d[tree.tag] = tree.text  
  elif len(tree) < 0:
     d[tree.tag] = {}   
  else:   
     d[tree.tag] = map(xml_to_dict, tree)  
 return d

这给了你你所要求的。

于 2012-09-07T23:33:21.420 回答
0

目前尚不清楚您要使用什么输出格式。这是尝试接近您的代码的一种可能性:

empty = lambda s: not (s and s.strip())

def xml_to_dict(root):
    assert empty(root.tail), 'tail is not supported'
    d = root.attrib
    assert root.tag not in d, 'tag and attribute name conflict'
    if len(root) > 0: # has children
       assert empty(root.text), 'text and chilren conflict'
       d[root.tag] = map(xml_to_dict, root)
    elif not empty(root.text):
       d[root.tag] = root.text
    return d

一般情况下是不可逆的。

例子

import pprint
import xml.etree.ElementTree as etree

xml = """<graphics type='xxx' port='0' autoport='xxx' listen='0.0.0.0'>
  <listen type='address' address='0.0.0.0'/>
 <value>1</value>
 <blank/>
</graphics>
"""
pprint.pprint(xml_to_dict(etree.fromstring(xml)))

输出

{'autoport': 'xxx',
 'graphics': [{'address': '0.0.0.0', 'type': 'address'}, {'value': '1'}, {}],
 'listen': '0.0.0.0',
 'port': '0',
 'type': 'xxx'}

注意:<listen>标签名称不在graphics列表中,<blank/>而是在列表{}中。

于 2012-09-08T01:24:05.593 回答
0
from lxml import etree
dict(etree.fromstring(xml).items())

输出

{'autoport': 'xxx', 'type': 'xxx', 'port': '0', 'listen': '0.0.0.0'}
于 2012-09-07T23:19:00.620 回答