2016-06-22 3 views
1

Из этого post я знаю, что могу .find(), .findall() и .text(), чтобы получить значения, вложенные в теги.Прочитайте GPX, используя lxml и xpath

Возьмем следующий .gpx файл в качестве примера,

<?xml version="1.0"?> 
<gpx version="1.1" creator="Trails 1.28 - https://www.trails.io" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxtpx="http://www8.garmin.com/xmlschemas/TrackPointExtensionv2.xsd" xmlns:trailsio="http://trails.io/GPX/1/0" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://trails.io/GPX/1/0 https://trails.io/GPX/1/0/trails_1.0.xsd"> 
    <metadata> 
     <time>2016-03-27T06:30:06Z</time> 
    </metadata> 
    <trk> 
     <name><![CDATA[xyz]]></name> 
     <extensions><trailsio:TrackExtension><trailsio:activity>trekking</trailsio:activity></trailsio:TrackExtension></extensions> 
     <trkseg> 
      <trkpt lat="22.491121" lon="114.137634"> 
       <ele>41.270</ele> 
       <time>2016-03-27T01:21:21Z</time> 
      </trkpt> 
      <trkpt lat="22.491104" lon="114.137612"> 
       <ele>42.777</ele> 
       <time>2016-03-27T01:21:38Z</time> 
      </trkpt> 
     </trkseg> 
    </trk> 
</gpx> 

Если я хочу, чтобы получить повышение, я могу попробовать:

gpx = etree.parse("D:/Users/perry/Downloads/abc.gpx") 
ele = gpx.findall("{http://www.topografix.com/GPX/1/1}trk") 
ele = [x.findall("{http://www.topografix.com/GPX/1/1}trkseg") for x in ele][0] 
ele = [x.findall("{http://www.topografix.com/GPX/1/1}trkpt") for x in ele][0] 
ele = [x.findall("{http://www.topografix.com/GPX/1/1}ele") for x in ele] 
[x[0].text for x in ele] 

И выход ['41.270', '42.777'], это то, что я хочу ! Большой!

Однако, я хотел бы использовать .xpath(), но

gpx.xpath("//ele") 

,

gpx.xpath("//{http://www.topografix.com/GPX/1/1}ele") 

и

gpx.xpath("//ele", namespaces = {'ele': "http://www.topografix.com/GPX/1/1"}) 

либо вернуть [] или ошибка «lxml.etree.XPathEvalError: Invalid выражение».

Как я могу получить высоту с помощью .xpath()?

Спасибо!

ответ

1

Вы на правильном пути:

gpx.xpath("//ele", namespaces = {'ele': "http://www.topografix.com/GPX/1/1"}) 

Поскольку это пространство имен по умолчанию в XML, то XPath //ele по себе не найти ele элемент в http://www.topografix.com/GPX/1/1 пространстве имен.

Поэтому необходимо зарегистрировать префикс с поставщиком XPath, который вы сделали. Однако вам необходимо ссылаться на элемент, используя его зарегистрированный префикс. Таким образом, будут работать:

gpx.xpath("//gpx:ele", namespaces = {'gpx': "http://www.topografix.com/GPX/1/1"}) 

 Смежные вопросы

  • Нет связанных вопросов^_^