Использование рекурсии для помещения вложенной структуры в словарь без потери структуры - PullRequest
0 голосов
/ 22 марта 2012

У меня есть элемент, у которого есть предметы и тег. Элемент может содержать больше элементов, которые также имеют элементы и тег, и эти элементы также могут иметь элементы и тег. Предварительно я не знаю, сколько «вложенных» элементов в первом элементе.

Я хочу сохранить тег и элементы в словаре с элементом в качестве ключа, и если элемент имеет «вложенный» элемент, я хочу сохранить этот элемент и его информацию в той же записи словаря, что и его «родительский элемент» .

Код, который у меня есть, работает, только если у первого элемента есть вложенный элемент, а во вложенном элементе нет другого вложенного элемента. Это код:

def getAllNestedElementInformation(element, nestedDict=None):
    infoDict = {'tagName':element.tag}
    infoDict.update(getItems(element))

    if nestedDict == None:
        nestedDict = infoDict
    else:
        nestedDict['nestedElement'][element] = infoDict
        print nestedDict

    for nestedElement in element:
        nestedDict.update({'nestedElement':collections.defaultdict(dict)})
        getAllNestedElementInformation(nestedElement, nestedDict=nestedDict)

Я хочу иметь

 {'name':'scan', 'nestedElement':{'name':'scanwindow', 'nestedElement':{'name:'cvParam'}}}

но я не иду дальше, чем

{'name':'scan', 'nestedElement':{'name:'scanwindow'}}

потому что я не знаю, как отобразить следующий nestedElement в слове 'nestedElement'.

Чтобы привести пример того, что у меня есть сейчас и что я хочу получить, когда я печатаю nestedDict, я получаю:

{'index': '0', 'nestedElement': {<Element 'scan' at 0x8068180>: {'tagName': 'scan'}}, 'tagName': 'spectrum', 'id': '1'}
{'index': '0', 'nestedElement': {<Element 'cvParam' at 0x80682a0>: {'name': 'scan start time', 'unitName': 'second', 'tagName': 'cvParam', }}, 'tagName': 'spectrum', 'id': '1'}

И я хочу иметь:

{'index': '0', 'nestedElement': {<Element 'scan' at 0x8068180>: 'tagName': 'scan', 'nestedElement: {'name': 'scan start time', 'unitName': 'second', 'tagName': 'cvParam', }}, 'tagName': 'spectrum', 'id': '1'}

Ответы [ 3 ]

2 голосов
/ 22 марта 2012

Выглядит точно так, как организованы данные, также в Конфигурации инструмента, который я написал.

Возможно, вы захотите посмотреть файл InternalCfg.py :

  • get_value() возвращает значение.
  • set_value() устанавливает значение.

Есть некоторые другие (вспомогательные) функции, например append_list() добавляет значение в список.

0 голосов
/ 23 марта 2012

Пришлось сохранить возвращаемое значение getAllNestedElementInformation в словаре. Просто если кто-то хочет знать: вот что я изменил в своем коде:

def getAllNestedElementInformation(element):
    infoDict = collections.defaultdict(dict)
    infoDict[element] = {'tagName':element.tag}
    infoDict[element].update(getItems(element))
    if element.text != None:
        if element.text.strip() != '':
            infoDict[element].update({'content':element.text})

    for nestedElement in element:
        infoDict[element]['nestedElement'] = getAllNestedElementInformation(nestedElement)  

    return infoDict 
0 голосов
/ 22 марта 2012

Ваш код не имеет рекурсивного вызова. Вот почему вы можете спуститься только на один уровень.

Возможно, вам нужно изменить getAllNestedElementInformation на getInfo (или наоборот)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...