user3628960
user3628960

Reputation: 59

Python and lxml: get sub-sub-element from given element

I have this XML code:

<ProceduresDB>
  <Airport ICAOcode="EHRD">
    <Sid Name="ANDI1A" Runways="06">
      <Sid_Waypoint ID="1">
        <Latitude>0.000000</Latitude>
        <Longitude>0.000000</Longitude>
      </Sid_Waypoint>
      <Sid_Waypoint ID="2">
        <Latitude>51.973697</Latitude>
        <Longitude>4.480970</Longitude>
      </Sid_Waypoint>
    <Sid Name="ARNE2A" Runways="06">
      <Sid_Waypoint ID="1">
      etc etc

How do I get for example all the latitudes and longitudes for each waypoint for Sid with Name='ANDI1A'?

I've been trying to come up with something using lxml, but most tutorials/howto's do cover XML documents with nested children.

Upvotes: 1

Views: 583

Answers (1)

alecxe
alecxe

Reputation: 473753

You can use .//Sid[@Name="ANDI1A"]/Sid_Waypoint xpath expression:

import lxml.etree as ET

data = """<ProceduresDB>
  <Airport ICAOcode="EHRD">
    <Sid Name="ANDI1A" Runways="06">
      <Sid_Waypoint ID="1">
        <Latitude>0.000000</Latitude>
        <Longitude>0.000000</Longitude>
      </Sid_Waypoint>
      <Sid_Waypoint ID="2">
        <Latitude>51.973697</Latitude>
        <Longitude>4.480970</Longitude>
      </Sid_Waypoint>
    </Sid>
   </Airport>
</ProceduresDB>"""

tree = ET.fromstring(data)
for waypoint in tree.findall('.//Sid[@Name="ANDI1A"]/Sid_Waypoint'):
    print "Waypoint %s" % waypoint.attrib["ID"]
    for item in waypoint:
        print item.tag, item.text

Prints:

Waypoint 1
Latitude 0.000000
Longitude 0.000000
Waypoint 2
Latitude 51.973697
Longitude 4.480970

Upvotes: 1

Related Questions