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

для xml

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

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

Есть ли способ сделать это ИСПОЛЬЗУЯ cElementTree? Я могу сделать это для детей, данных, но, к сожалению, дочерние элементы идентичны по всем значениям, поэтому от него мало пользы.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
8
0
6 129
3

Ответы 3

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

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

В документации написано что-то вроде Changed in version 2.7: The ElementTree API is updated to 1.3. в docs.python.org/2/library/xml.etree.elementtree. Я использую 2.7, но для меня '../myparent' все еще не работает; Что это значит?

n611x007 11.01.2013 02:45

Да, я не думаю, что это поддержка в cElementTree. например: ET.fromstring ("<a> <b> </b> </a>") .find ('.// ​​b'). find ('..') возвращает None

Andy Smith 09.10.2014 14:27

@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**).

Bob 16.06.2016 23:18
parent_map = dict((c, p) for p in tree.getiterator() for c in p)
parent_map[el].remove(el)

+1. потому что в elementTree доступ к родительскому элементу .. нарушен или не работает, или каким-либо другим способом, о котором я не знаю. так что ваш способ решит это !!! мы также можем сделать это как {c:p for p in tree.getiterator() for c in p}

namit 29.01.2013 14:52

@namit Я могу это подтвердить. Я могу правильно получить доступ к своим узлам, но когда я делаю print('parent = ', el.findall("../")), как сказал это, я получаю нулевые объекты.

Bob 16.06.2016 23:06

@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).ссылка на сайт

Bob 16.06.2016 23:53

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

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

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

Другие вопросы по теме