美文网首页
python xml 转 dict 轮子

python xml 转 dict 轮子

作者: 吴敏民_354a | 来源:发表于2018-03-14 15:16 被阅读0次

    # -*- 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']

    相关文章

      网友评论

          本文标题:python xml 转 dict 轮子

          本文链接:https://www.haomeiwen.com/subject/hcmfqftx.html