Как получить родительский узел с помощью cElementTree?

для xml

<grandparent>
  <parent1>
     <child>data1</child>
  </parent1>
  <parent2>
     <child>data2</child>
  </parent2>
</grandparent>

Мне нужен список, содержащий кортежи родителя, данные для каждого родителя в xml.

Есть ли способ сделать это, используя cElementTree? Я могу сделать это для ребенка, данные, но, к сожалению, ребенок идентичен во всех значениях, поэтому он не очень полезен.


person Mohit Ranka    schedule 17.12.2008    source источник


Ответы (3)


Кажется, вы можете получить доступ к родителю от дочернего элемента, используя ElementTree версии 1.3 (проверьте http://effbot.org/zone/element-xpath.htm), используя команды xpath, такие как child.find('../parent'). Но я думаю, что Python поставляется с версией 1.2 или чем-то вроде того.

Вам также следует проверить lxml, который совместим с etree и имеет полную поддержку Xpath http://lxml.de/.

person Mapad    schedule 17.12.2008
comment
Документы говорят что-то вроде Changed in version 2.7: The ElementTree API is updated to 1.3. в docs.python.org/2/library/xml .etree.elementtree Я использую 2.7, но для меня '../myparent' все еще не работает; Что это значит? - person n611x007; 11.01.2013
comment
Да, я не думаю, что это поддерживается в cElementTree. например: ET.fromstring(‹a›‹b›‹/b›‹/a›).find('.//b').find('..') возвращает None - person Andy Smith; 09.10.2014
comment
@AndySmith Думаю, я знаю, почему он ничего не возвращает. В документе говорится: Selects the parent element. Returns None if the path attempts to reach the ancestors of the start element (**the element find was called on**). - person Bob; 16.06.2016

Этот синтаксис, похоже, работал для cElementTree

ET.fromstring("<c><a><b></b></a></c>").find('.//b/..')

Нет перехода к базовому родителю и использование двойной косой черты, а затем одинарной косой черты в пути.
(можно было бы опубликовать как комментарий к вышеприведенной ветке, но, похоже, у меня нет привилегий)

person MerryDan    schedule 05.07.2016

person    schedule
comment
+1. потому что в elementTree доступ к родителю с помощью .. не работает или не работает, или каким-либо другим способом, который я не знаю. так что ваш способ решит это !!! мы также можем сделать это как {c:p for p in tree.getiterator() for c in p} - person namit; 29.01.2013
comment
@namit Я могу это подтвердить. Я могу правильно получить доступ к своим узлам, но когда я делаю print('parent = ', el.findall("../")), как это говорит так, я получаю нулевые объекты. - person Bob; 16.06.2016
comment
@namit оказывается, я неправильно прочитал документацию для ..: Selects the parent element. Returns None if the path attempts to reach the ancestors of the start element (the element find was called on).ссылка - person Bob; 16.06.2016