атрибуты не отображаются в выводе xml2dict даже при xml_attribs = True - PullRequest
0 голосов
/ 19 мая 2018

У меня проблема с python xmltodict.Следуя почти согласованной рекомендации здесь , я попробовал xmltodict, и он мне очень понравился, пока мне не пришлось обращаться к атрибутам на верхнем уровне моего обработчика.Я, вероятно, делаю что-то не так, но мне не ясно, что.У меня есть XML-документ, который выглядит примерно так

<api>
<cons id="79550" modified_dt="1526652449">
<firstname>Mackenzie</firstname>
...
</cons>
<cons id="79551" modified_dt="1526652549">
<firstname>Joe</firstname>
...
</cons>
<api>

Я анализирую его следующим образом:

xmltodict.parse(apiResult.body, item_depth=2, item_callback=handler, xml_attribs=True)

, где apiResult.body содержит XML, показанный выше.Но, несмотря на xml_attribs=True, я не вижу @id или @modified_dt в выводе после синтаксического анализа в обработчике, хотя все элементы в оригинале действительно появляются.

Обработчик закодирован следующим образом:

def handler(_, cons):
    print (cons)
    mc = MatchChecker(cons)
    mc.check()
    return True

Что я могу делать не так?

Я также попробовал xmljson и сразу не понравился ему так же, как xmltodict, если толькоУ меня был способ обойти эту проблему.У кого-нибудь есть решение этой проблемы или пакет, который бы справился с этим лучше?

1 Ответ

0 голосов
/ 19 мая 2018

xmltodict работает просто отлично, но вы анализируете аргумент item_depth=2, который означает, что ваш обработчик будет видеть только элементы внутри элементов <cons>, а не сам элемент <cons>.

xml = """
<api>
<cons id="79550" modified_dt="1526652449">
<firstname>Mackenzie</firstname>
</cons>
</api>
"""

def handler(_,arg):
    for i in arg.items():
        print(i)
    return True

xmltodict.parse(xml, item_depth=2, item_callback=handler, xml_attribs=True)

Печать ('firstname', 'Mackenzie'), как и ожидалось.

Принимая во внимание:

xmltodict.parse(xml, item_depth=1, item_callback=handler, xml_attribs=True)

Печать ('cons', OrderedDict([('@id', '79550'), ('@modified_dt', '1526652449'), ('firstname', 'Mackenzie')])), снова, как и ожидалось.

...