python xml 转 dict 轮子

# -*- coding:utf-8 -*-

"""

Thunder Chen 2007.9.1

"""

try:

import xml.etree.ElementTreeas ET

except:

import cElementTreeas ET# for 2.4

import re

"""

object_dict

nkchenz@gmail.com 2007

Provided as-is; use at your own risk; no warranty; no promises; enjoy!

"""

class object_dict(dict):

"""object view of dict, you can

>>> a = object_dict()

>>> a.fish = 'fish'

>>> a['fish']

'fish'

>>> a['water'] = 'water'

>>> a.water

'water'

>>> a.test = {'value': 1}

>>> a.test2 = object_dict({'name': 'test2', 'value': 2})

>>> a.test, a.test2.name, a.test2.value

(1, 'test2', 2)

"""

    def __init__(self, initd=None):

if initdis None:

initd = {}

dict.__init__(self, initd)

def __getattr__(self, item):

d =self.__getitem__(item)

# if value is the only key in object, you can omit it

        if isinstance(d,dict)and 'value' in dand len(d) ==1:

return d['value']

else:

return d

def __setattr__(self, item, value):

self.__setitem__(item, value)

class XML2Dict(object):

def __init__(self):

pass

    def _parse_node(self, node):

node_tree = object_dict()

# Save attrs and text, hope there will not be a child with same name

        if node.text:

node_tree.value = node.text

for (k,v)in node.attrib.items():

k,v =self._namespace_split(k, object_dict({'value':v}))

node_tree[k] = v

#Save childrens

        for childin node.getchildren():

tag, tree =self._namespace_split(child.tag,self._parse_node(child))

if  tagnot in node_tree:# the first time, so store it in dict

                node_tree[tag] = tree

continue

            old = node_tree[tag]

if not isinstance(old,list):

node_tree.pop(tag)

node_tree[tag] = [old]# multi times, so change old dict to a list

            node_tree[tag].append(tree)# add the new one

        return  node_tree

def _namespace_split(self, tag, value):

"""

Split the tag  '{http://cs.sfsu.edu/csc867/myscheduler}patients'

ns = http://cs.sfsu.edu/csc867/myscheduler

name = patients

"""

        result = re.compile("\{(.*)\}(.*)").search(tag)

if result:

print tag

value.namespace, tag = result.groups()

return (tag, value)

def parse(self, file):

"""parse a xml file to a dict"""

        f =open(file,'r')

return self.fromstring(f.read())

def fromstring(self, s):

"""parse a string"""

        t = ET.fromstring(s)

root_tag, root_tree =self._namespace_split(t.tag,self._parse_node(t))

return object_dict({root_tag: root_tree})

if __name__ =='__main__':

s ="""

10

491691test

491692test2

503938hello, world

"""

    s ='''                                                                              172.16.140.2                            1000                                    2018020900871                        2009南京南昌广州深圳80*40Gb/sDWDM系统(华为)                        华为                        5075-南昌孺子路(惠州江北方向)(OptiX%BWS%1600G)                '''

    s ='''1200201802090002324152-恩施红庙-重庆方向-0-15-30-SFANA27.0065'''

    r = XML2Dict().fromstring(s)

from pprintimport pprint

pprint(r)

print r['Envelope']['Body']['eFlowReceiveBoardResponse']['result']['optLtemp']['value']

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容