Получить все дочерние элементы указанного узла c в Python - PullRequest
0 голосов
/ 13 января 2020

У меня есть следующий пример. 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

1 Ответ

2 голосов
/ 13 января 2020

Я думаю, что для создания простого списка (['Value of child one A', 'Value of child two A', 'This is a different value for Child one A', 'This is a different value for Child Two A', 'A final value for Child one A', 'A final value for Child one A']) вы можете использовать

[child.xpath('string()') for sibling in doc.xpath('//SiblingTwoA[preceding-sibling::*[1][self::SiblingOneA]]') for child in sibling.xpath('*')]

для создания вложенного списка ([['Value of child one A', 'Value of child two A'], ['This is a different value for Child one A', 'This is a different value for Child Two A'], ['A final value for Child one A', 'A final value for Child one A']]), который вы можете использовать

[[child.xpath('string()') for child in sibling.xpath('*')] for sibling in doc.xpath('//SiblingTwoA[preceding-sibling::*[1][self::SiblingOneA]]')]
...