У меня есть следующий пример. xml структура:
<ParentOne>
<SiblingOneA>This is Sibling One A</SiblingOneA>
<SiblingTwoA>
<ChildOneA>Value of child one A</ChildOneA>
<ChildTwoA>Value of child two A</ChildTwoA>
</SiblingTwoA>
</ParentOne>
<ParentTwo>
<SiblingOneA>This is a different value for Sibling one A</SiblingOneA>
<SiblingTwoA>
<ChildOneA>This is a different value for Child one A</ChildOneA>
<ChildTwoA>This is a different value for Child Two A</ChildTwoA>
</SiblingTwoA>
</ParentTwo>
<ParentThree>
<SiblingOneA>A final value for Sibling one A</SiblingOneA>
<SiblingTwoA>
<ChildOneA>A final value for Child one A</ChildOneA>
<ChildTwoA>A final value for Child one A</ChildTwoA>
</SiblingTwoA>
</ParentThree>
Мое главное требование - l oop через каждый из узлов, и когда текущий рассматриваемый узел - "SiblingOneA", код проверяет, является ли соседний узел «SiblingTwoA». Если это так, то он должен извлечь все дочерние узлы (как сами элементы, так и значения внутри элементов).
Пока это мой код:
from lxml import etree
XMLDoc = etree.parse('example.xml')
rootXMLElement = XMLDoc.getroot()
tree = etree.parse('example.xml)
import os
for Node in XMLDoc.xpath('//*'):
if os.path.basename(XMLDoc.getpath(Node)) == "SiblingOneA":
if Node.getnext() is not None:
if Node.getnext().tag == "SiblingTwoA":
#RETRIEVE ALL THE CHILDREN ELEMENTS OF THAT SPECIFIC SiblingTwoA NODE AND THEIR VALUES
Как вы возможно, из моего кода, приведенного выше, я не знаю, что поместить вместо комментария, чтобы получить все дочерние элементы и значения узла "SiblingTwoA". Кроме того, этот код должен не возвращать все дочерние элементы узлов SiblingTwoA во всей древовидной структуре, а только один из рассматриваемых (т. Е. Тот, который возвращен из элемента Node.getnext ()). Вы также заметили, что многие элементы одинаковы, но их значения различны.
РЕДАКТИРОВАТЬ:
Мне удалось получить дочерние элементы рассматриваемый элемент, используя Node.getnext().getchildren()
. Однако это возвращает информацию в форме списка, например:
[<Element ChildOneA at 0x101a95870>, <Element ChildTwoA at 0x101a958c0>]
[<Element ChildOneA at 0x101a95a50>, <Element ChildTwoA at 0x101a95aa0>]
[<Element ChildOneA at 0x101a95c30>, <Element ChildTwoA at 0x101a95c80>]
Как я могу получить фактические значения внутри элементов?
Мой желаемый вывод для первой итерации например, было бы что-то вроде:
ChildOneA = Значение дочернего элемента один A
ChildTwoA = Значение дочернего элемента два A