Как получить родительский узел, используя cElementTree? - PullRequest
8 голосов
/ 17 декабря 2008

для xml

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

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

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

Ответы [ 3 ]

5 голосов
/ 21 сентября 2012
parent_map = dict((c, p) for p in tree.getiterator() for c in p)
parent_map[el].remove(el)
4 голосов
/ 17 декабря 2008

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

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

0 голосов
/ 05 июля 2016

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

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

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

...