доступ к родительскому узлу узла ElementTree

Я использую встроенный модуль Python ElementTree. Просто получить доступ к детям, но как насчет родительских или родственных узлов? – можно ли это сделать эффективно, не пройдя по всему дереву?

  • Почему «python setup.py sdist» создает нежелательные «PROJECT-egg.info» в корневом каталоге проекта?
  • Какое исключение я должен поднимать по неправильным / незаконным комбинациям аргументов в Python?
  • Scary's sparse eigsh () для небольших собственных значений
  • Networkx: Различия между pagerank, pagerank_numpy и pagerank_scipy?
  • Динамическое добавление поля в форму модели с использованием Django
  • Импортировать модуль python в несколько AWS Lambdas
  • Как удалить строку в массиве numpy, который содержит нуль?
  • Tkinter. После окна замораживания метода?
  • 6 Solutions collect form web for “доступ к родительскому узлу узла ElementTree”

    Нет прямой поддержки в виде parent атрибута, но вы можете использовать шаблоны, описанные здесь, для достижения желаемого эффекта. Предлагается следующий однострочный (из связанного сообщения) для создания сопоставления «ребенок-родитель» для всего дерева:

     parent_map = dict((c, p) for p in tree.getiterator() for c in p) 

    Ответ Vinay должен по-прежнему работать, но для Python 2.7+ и 3.2+ рекомендуется следующее:

     parent_map = {c:p for p in tree.iter() for c in p} 

    getiterator() устарел в пользу iter() , и неплохо использовать новый конструктор понимания списка.

    Во-вторых, при создании XML-документа возможно, что у ребенка будет несколько родителей, хотя это будет удалено после сериализации документа. Если это имеет значение, вы можете попробовать следующее:

     parent_map = {} for p in tree.iter(): for c in p: if c in parent_map: parent_map[c].append(p) # Or raise, if you don't want to allow this. else: parent_map[c] = [p] # Or parent_map[c] = p if you don't want to allow this 

    Вы можете использовать xpath ... нотацию в ElementTree.

     <parent> <child id="123">data1</child> </parent> xml.findall('.//child[@id="123"]...') >> [<Element 'parent'>] 

    Другой способ, если требуется только один родитель одного субэлемента, а также известен xpath.

     parentElement = subElement.find(xpath+"/..") 

    Если вы используете lxml, мне удалось получить родительский элемент со следующим:

     parent_node = next(child_node.iterancestors()) 

    Как упоминалось в элементе Get parent после использования метода find (xml.etree.ElementTree), вам придется выполнять косвенный поиск родителя. Имея xml:

     <a> <b> <c>data</c> <d>data</d> </b> </a> 

    Предполагая, что вы создали элемент etree в переменной xml , вы можете использовать:

      In[1] parent = xml.find('.//c/..') In[2] child = parent.find('./c') 

    В результате чего:

     Out[1]: <Element 'b' at 0x00XXXXXX> Out[2]: <Element 'c' at 0x00XXXXXX> 

    Более высокий родитель будет найден как: secondparent=xml.find('.//c/../..') являющийся <Element 'a' at 0x00XXXXXX>

    Python - лучший язык программирования в мире.