Разобрать данные из файла .gpx в файл CSV

У меня есть файл .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

person TheAptKid    schedule 31.03.2014    source источник
comment
Можете ли вы опубликовать желаемый результат?   -  person Lingamurthy CS    schedule 31.03.2014


Ответы (2)


легко с помощью 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
person Joel M. Lamsen    schedule 31.03.2014
comment
Это выглядит потрясающе. Не могли бы вы сказать мне, в какой программе я могу выполнить это преобразование? Пробовал онлайн-инструмент XSL Transformer: freeformatter.com/xsl-transformer.html, но это не сработало. - person TheAptKid; 31.03.2014
comment
Я также пытался использовать утилиту msxsl.exe, которая также не работает. - person TheAptKid; 31.03.2014
comment
Эта таблица стилей действительна. Он работает с Xalan, Saxon 6, Saxon 9. Найдите инструмент, использующий один из этих процессоров. Вероятно, вы можете сделать это с помощью пробной версии XML Spy или Oxygen XML Editor. - person helderdarocha; 31.03.2014
comment
Преобразование с помощью XML Developer (oXygen) завершается сбоем, хотя в нем говорится, что оба файла допустимы. - person TheAptKid; 31.03.2014
comment
То же самое с XML Spy. Должно быть, я делаю что-то не так. - person TheAptKid; 31.03.2014
comment
Я запустил это в xsltransform.net, и все в порядке (xsltransform.net/948Fn5m/1) - person Joel M. Lamsen; 01.04.2014

Слегка модифицированная версия отлично работает с msxml.exe, обрабатывающим GPX-файлы Garmin.

<?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>
person snahl    schedule 26.08.2014