# -*- 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']
网友评论