2016-06-22 12 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戻る:無効表現 "と呼ばれる。

.xpath()を使用して高度を取得するにはどうすればよいですか?

ありがとうございました! XMLのデフォルトの名前空間、http://www.topografix.com/GPX/1/1名前空間のele要素を見つけることができません、それ自身の上のXPath //eleがあるので

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

答えて

1

あなたがして正しい軌道に乗っています。

したがって、実行したXPathプロバイダに接頭辞を登録する必要があります。ただし、要素を登録された接頭辞を使用して参照する必要があります。したがって、次のように動作します:

gpx.xpath("//gpx:ele", namespaces = {'gpx': "http://www.topografix.com/GPX/1/1"}) 
関連する問題