для xml
<grandparent>
<parent1>
<child>data1</child>
</parent1>
<parent2>
<child>data2</child>
</parent2>
</grandparent>
Мне нужен список, содержащий кортежи родителя, данные для каждого родителя в xml.
Есть ли способ сделать это ИСПОЛЬЗУЯ cElementTree? Я могу сделать это для детей, данных, но, к сожалению, дочерние элементы идентичны по всем значениям, поэтому от него мало пользы.






Кажется, вы можете получить доступ к родительскому элементу от дочернего элемента, используя версию 1.3 ElementTree (проверьте http://effbot.org/zone/element-xpath.htm), используя команды xpath, такие как child.find('../parent'). Но я думаю, что python поставляется с версией 1.2 или чем-то в этом роде.
Вы также должны проверить lxml, который совместим с etree и имеет полную поддержку Xpath http://lxml.de/
Да, я не думаю, что это поддержка в cElementTree. например: ET.fromstring ("<a> <b> </b> </a>") .find ('.// b'). find ('..') возвращает None
@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**).
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 Я могу это подтвердить. Я могу правильно получить доступ к своим узлам, но когда я делаю print('parent = ', el.findall("../")), как сказал это, я получаю нулевые объекты.
@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).ссылка на сайт
Этот синтаксис, похоже, работал для cElementTree
ET.fromstring("<c><a><b></b></a></c>").find('.//b/..')
Не используется базовый родительский элемент и используется двойная косая черта, а затем одинарная косая черта в пути. (опубликовал бы как комментарий к вышеупомянутой теме, но, похоже, у меня нет права на это)
В документации написано что-то вроде
Changed in version 2.7: The ElementTree API is updated to 1.3.в docs.python.org/2/library/xml.etree.elementtree. Я использую 2.7, но для меня'../myparent'все еще не работает; Что это значит?