递归到字典深度

Recursion into dictionary depth

试图解析来自某些程序的 xml-请求,我的架构非常复杂。它是字典的字典的字典。一些字典还包含字典列表。但是由于结构太不舒服,我的字典在整个深度中包含很多“垃圾”词 "begin_""value"

例如:

<depart>
                                                                                                                                                                                                
    <BEGIN_>
                                                                                                                                                                                                               
        <id Value=""/>
                                                                                                                                                                                                                                       
        <code Value=""/>
                                                                                                                                                                                                               
        <name Value=""/>
                                                                                                                                                                                                                       
        <declNameList/>
                                                                                                                                                                                                
    </BEGIN_>
                                                                                                                                                                                 
</depart>

已经转型为

{'depart': {'BEGIN_': {'id': {'Value': ''},
             'code': {'Value': ''},
             'name': {'Value': ''},
             'declNameList': None}}}}}

我需要:

{'depart': {'id': '',
             'code': '',
             'name': '',
             'declNameList': None}}

你能帮我用全深度递归删除这个垃圾吗? 目前我设法将 h = {'status': {'BEGIN_': {'statusCode': {'Value': '0'}}}} 转换为 {'status': {'statusCode': {'Value': '0'}}} 通过使用:

if 'Value' in h['status'].keys():
    h['status'] = h['status']['Value']
if 'BEGIN_' in h['status'].keys():
    h['status'] = h['status']['BEGIN_']

但我需要对整个词典应用这种过滤器。

如评论中所述,如果可以解决 XML 解析过程中的问题,那将是更可取的。否则,我们可以使用带队列的非递归解决方案将文档的每个 inner/nested 元素入队并分别删除 BEGIN_Value

xml_dict = {
    'depart': {
        'BEGIN_': {
            'id1': {'Value': '11'},
            'code1': {'Value': '11'},
            'name1': {'Value': '11'},
            'declNameList1': None
        }
    },
    'BEGIN_': {
        "1": [
            {
                'id2': {'Value': '22'},
                'code2': {'Value': '22'},
                'name2': {'Value': '22'},
                'declNameList2': None
            },
            {
                'id3': {'Value': '33'},
                'code3': {'Value': '33'},
                'name3': {'Value': '33'},
                'declNameList3': None
            },
        ],
        "2": [
            {
                'id4': {'Value': '44'},
                'code4': {'Value': '44'},
                'name4': {'Value': '44'},
                'declNameList4': {
                    'code5': {'Value': '55'}
                },
            },
            {
                'id6': {'Value': '66'},
                'code6': {'Value': '66'},
                'name6': {'Value': '66'},
                'declNameList6': {
                    'code7': {
                        'BEGIN_': {
                            'name8': {'Value': '8'}
                        }
                    }
                },
            },
            {
                'any1': {'Value': '1'}
            },
            [
                {
                    "BEGIN_": {
                        'any2': {'Value': '2'}
                    },
                },
                {
                    "BEGIN_": {
                        'any3': {'Value': '3'}
                    },
                }
            ]
        ]
    }
}


queue = [xml_dict]

while queue:
    data = queue.pop()

    if isinstance(data, dict):
        if begin_value := data.pop("BEGIN_", None):
            data.update(begin_value)
            
        for key, value in data.items():
            if isinstance(value, dict) and value.keys() == {"Value"}:
                data[key] = value["Value"]
            elif isinstance(value, (dict, list)):
                queue.append(value)

    elif isinstance(data, list):
        for item in data:
            if isinstance(item, (dict, list)):
                queue.append(item)

print(xml_dict)

输出

{
    "depart": {
        "id1": "11",
        "code1": "11",
        "name1": "11",
        "declNameList1": None
    },
    "1": [
        {
            "id2": "22",
            "code2": "22",
            "name2": "22",
            "declNameList2": None
        },
        {
            "id3": "33",
            "code3": "33",
            "name3": "33",
            "declNameList3": None
        }
    ],
    "2": [
        {
            "id4": "44",
            "code4": "44",
            "name4": "44",
            "declNameList4": {
                "code5": "55"
            }
        },
        {
            "id6": "66",
            "code6": "66",
            "name6": "66",
            "declNameList6": {
                "code7": {
                    "name8": "8"
                }
            }
        },
        {
            "any1": "1"
        },
        [
            {
                "any2": "2"
            },
            {
                "any3": "3"
            }
        ]
    ]
}