xmltodict unparse parse не то же самое
import xmltodict
test_data = {'value1': 1, 'parent_lvl1': {'parent_Lvl2': {'value1': 2, 'value2': 3}}}
print("test_data : ", test_data)
xml_str = xmltodict.unparse({'settings' : test_data})
print("dict to xml string :", xml_str)
test_data_re = xmltodict.parse(xml_str, dict_constructor=dict)
print("xml_str back to dict : ", test_data_re['settings'])
Результаты: test_data: {'parent_lvl1': {'parent_Lvl2': {'value2': 3, 'value1': 2}}, 'value1': 1} продиктовать строке xml: 321 xml_str вернуться к dict: {'parent_lvl1': {'parent_Lvl2': {'value2': '3', 'value1': '2'}}, 'value1': '1'}
В результате, когда я делаю сравнение между старым диктатом и новым, они отличаются. Как получить xmltodict, чтобы разобрать то, что он анализировал в первую очередь
1 ответ
Я не думаю, что вы должны ожидать, что они оба будут одинаковыми в целом и все время.
Целочисленные значения не приводятся к целым числам во время синтаксического анализа, и все разбивается на строки, но у вас есть несколько способов управления преобразованием типов. Например, вы можете указать постпроцессор и попробовать преобразовать значения в целые числа для ключей, начинающихся с value
:
def postprocessor(path, key, value):
if key.startswith("value"):
try:
return key, int(value)
except (ValueError, TypeError):
return key, value
return key, value
test_data_re = xmltodict.parse(xml_str, dict_constructor=dict, postprocessor=postprocessor)
print("xml_str back to dict : ", test_data_re['settings'])
Это даст:
xml_str back to dict : {'value1': 1, 'parent_lvl1': {'parent_Lvl2': {'value1': 2, 'value2': 3}}}
Кстати, хорошее место для поиска xmltodict
пример использования xmltodict
тесты, проверьте это.