2014-03-31 26 views
1

我有一個.GPX文件看起來像這樣:解析數據文件

<?xml version="1.0" encoding="UTF-8"?> 
    <gpx version="1.1"> 
     <metadata> 
      <author> 
      <name>asd</name> 
      <email id="asd" domain="gmail.com"/> 
      </author> 
      <link href="http://www.endomondo.com"> 
      <text>Endomondo</text> 
      </link> 
      <time>2014-03-25T15:58:33Z</time> 
     </metadata> 
     <trk> 
      <src>http://www.endomondo.com/</src> 
      <link href="http://www.endomondo.com/workouts/246394762/4704124"> 
       <text>endomondo</text> 
      </link> 
      <type>MOUNTAIN_BIKING</type> 
      <trkseg> 
       <trkpt lat="12.123456" lon="12.123456"> 
        <time>2013-09-16T12:01:23Z</time> 
       </trkpt> 
       <trkpt lat="12.123456" lon="12.123456"> 
        <ele>627.5</ele> 
        <time>2013-09-16T12:01:28Z</time> 
       </trkpt> 
       ...additional <trkpt> nodes 
      </trk> 

我想提取每個trkpt節點的經度和緯度,時間和高程值和將它們輸出爲CSV文件。我聽說過XSLT轉換,但我不知道如何編寫它們。另一種方法是使用xml/gpx解析器。

有沒有更快的方法我可以檢索這些值?

輸出CSV應該在這個形式:

latitude \t longitude \t elevation(if present) \t time 
+0

您可以發佈所需的輸出嗎? –

回答

3

容易使用XSLT-1.0

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:output method="text"/> 

    <xsl:template match="/"> 
     <xsl:text>longitude,latitude,time,elevation&#xD;&#xA;</xsl:text> 
     <xsl:for-each select="gpx/trk/trkseg/trkpt"> 
      <xsl:value-of select="concat(@lon, ',', @lat, ',', time, ',', ele, '&#xD;&#xA;')"/> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

它輸出

longitude,latitude,time,elevation 
12.123456,12.123456,2013-09-16T12:01:23Z, 
12.123456,12.123456,2013-09-16T12:01:28Z,627.5 
+0

這看起來很棒。請告訴我可以執行這個轉換的程序是什麼?嘗試了一個在線XSL Transformer工具:http://www.freeformatter.com/xsl-transformer.html,但它沒有奏效。 – TheAptKid

+0

我也嘗試使用msxsl.exe工具,這也不起作用。 – TheAptKid

+0

這個樣式表是有效的。它可以與Xalan,Saxon 6,Saxon 9一起使用。查找使用其中一個處理器的工具。您可以使用XML Spy或Oxygen XML Editor的試用版進行操作。 – helderdarocha

0

略加修改正常工作與「MSXML。 exe'處理Garmin GPX文件。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:gpx="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"> 
<xsl:output method="text" indent="yes" encoding="utf-8"/> 
<xsl:template match="/"> 
    <xsl:text>latitude,longitude,elevation,time,&#xD;&#xA;</xsl:text> 
    <xsl:for-each select="/gpx:gpx/gpx:trk/gpx:trkseg/gpx:trkpt"> 
     <xsl:value-of select="concat(@lat, ',', @lon, ',', gpx:ele, ',', gpx:time, '&#xD;&#xA;')"/> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet>