xmltodict unparse parse не то же самое - PullRequest
0 голосов
/ 12 декабря 2018
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 Ответ

0 голосов
/ 12 декабря 2018

Не думаю, что вы должны ожидать, что они оба будут одинаковыми в целом и всегда.

Целочисленные значения не приводятся к целым числам при автоматическом разборе, и все разбирается на строки, ноу вас есть несколько способов контролировать преобразование типов.Например, вы можете указать постпроцессор и попытаться преобразовать значения в целые числа для ключей, начинающихся с 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 тесты , проверьте.

...