Jak dostać się do zagnieżdżonego elementu w xml

0
from lxml import etree 
tree = etree.parse(path)
xml = tree.getroot()
for x in xml.findall('./data/data1/data2/data3'):
     print(x) #powinno wypisać dwa elemeny?
<?xml version="1.0"?>
<data>
  <data1>
    <data2>
      <data3>
          <val>5</val>
      </data3>
      <data3>
          <val>6</val>
      </data3>
    </data2>
  </data1>
</data>

Program nie wypisuje nic.Co robię źle? Generalnie w moim zadaniu interesują mnie tylko dane w sekcja data3.

1

Rozwiązanie w xml.etree.ElementTree, ale API jest takie samo.
findall szuka tylko wśród dzieci elementu, więc Ci nie znajdzie tak zagnieżdżonych tagów. Można użyć itertext:

# xml for 4programmers: https://4programmers.net/Forum/Newbie/316282-jak_dostac_sie_do_zagniezdzonego_elementu_w_xml
import xml.etree.ElementTree as ET
tree = ET.parse('xml_file_example.xml')
root = tree.getroot()

[x for x in root.itertext() if x.isalnum()]  # -> ['5', '6']

Albo iter:

[val.text for val in root.iter('val')]  # ->  ['5', '6']

Zresztą, patrząc na docs, można to zrobić na więcej sposobów.

EDIT: Sorki, poprawiłem kod, bo w poprzedniej wersji dla itertext drukowało wszystko jak leci, taby, nowe linie...

1 użytkowników online, w tym zalogowanych: 0, gości: 1