40usov
10/3/2019 - 3:05 PM

DictToXML.py

class MagicXML:
    """Converter Dict to XML
    --------------------------------------------------------
        Example dict:
            dict = [{'tag': 'categories', 'sub': [{'tag': 'category', 'text': 'Shop', 'attr': {'id': 3, 'pop': 'op'}},
                                                  {'tag': 'category', 'attr': {'id': '25'}, 'sub': [{'tag': 'subtag',
                                                                                                     'text': 'Hello'}]},
                                                  {'tag': 'category', 'text': 'TEXT', 'attr': {'id': '26'}}]
                    }]
    --------------------------------------------------------
        Exit:
            <categories>
                <category id="3" pop="op">Shop</category>
                <category id="25">
                    <subcategory>Hello</subcategory>
                </category>
                <category id="26">TEXT</category>
            </categories>
    --------------------------------------------------------
        tag - tag <categories>
        sub - sub tag category <subcategory>
        text - text <category id="26">TEXT</category>
        attr - attributes id_str="3" id_int=3 pop="op"
    """
    def __init__(self, list_dic):
        self.list_dic = list_dic

    def create_p(self, list_dic, tab):
        free = ''
        for dic_t in list_dic:
            tag = ''
            text = ''
            tag = tag + dic_t['tag']
            if 'attr' in dic_t:
                for i in dic_t['attr']:
                    if type(dic_t['attr'][i]) is str:
                        tag += ' {}="{}"'.format(i, dic_t['attr'][i])
                    elif type(dic_t['attr'][i]) is int:
                        tag += ' {}={}'.format(i, dic_t['attr'][i])
            if 'text' in dic_t:
                text = dic_t['text']

            if 'sub' in dic_t:
                ret_string = '<{}>\n{}\n</{}>'.format(tag, self.create_p(dic_t['sub'], tab + '\t'), dic_t['tag'])
                # ret_string = '<{}>\n{}{}\n</{}>'.format(tag, tab, self.create_p(dic_t['sub'], tab+'\t'), dic_t['tag'])
            else:
                ret_string = '<{}>{}</{}>'.format(tag, text, dic_t['tag'])
            if free == '':
                free = free + ret_string
            else:
                free = free + '\n' + ret_string
        return free

    def __repr__(self):
        self.tab = '\t'
        return self.create_p(self.list_dic, self.tab)