从GPX文件中填充C#中的数据表

时间:2016-06-19 15:54:39

标签: c# datatable gpx

如果有人告诉我是否有办法将GPX文件导入C#数据表,我将不胜感激。 我用Google搜索了很多次但是徒劳无功。

2 个答案:

答案 0 :(得分:1)

解决这个问题的一种方法是将XML反序列化为一个对象,然后您可以根据需要进行导航和使用。

使用从Garmin Oregon 400T生成的XML数据作为示例:

<gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" creator="Oregon 400t" version="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 http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd">
  <metadata>
    <link href="http://www.garmin.com">
      <text>Garmin International</text>
    </link>
    <time>2009-10-17T22:58:43Z</time>
  </metadata>
  <trk>
    <name>Example GPX Document</name>
    <trkseg>
      <trkpt lat="47.644548" lon="-122.326897">
        <ele>4.46</ele>
        <time>2009-10-17T18:37:26Z</time>
      </trkpt>
      <trkpt lat="47.644548" lon="-122.326897">
        <ele>4.94</ele>
        <time>2009-10-17T18:37:31Z</time>
      </trkpt>
      <trkpt lat="47.644548" lon="-122.326897">
        <ele>6.87</ele>
        <time>2009-10-17T18:37:34Z</time>
      </trkpt>
    </trkseg>
  </trk>
</gpx>

您可以创建一些可用于反序列化XML的自定义类:

[Serializable()]
[System.Xml.Serialization.XmlRoot("gpx")]
public class gpx {
    [System.Xml.Serialization.XmlElement("metadata")]
    public Metadata mData { get; set; }

    [System.Xml.Serialization.XmlElement("trk")]
    public TrackCollection tCollection { get; set; }
}

[Serializable()]
public class Metadata {
    /// Fill in metadata elements here
}

[Serializable()]
public class TrackCollection {
    [System.Xml.Serialization.XmlElement("name")]
    public string name { get; set; }

    [XmlArray("trkseg")]
    [XmlArrayItem("trkpt", typeof(TrackPart))]
    public TrackPart[] tPart { get; set; }
}

[Serializable()]
public class TrackPart {
    [System.Xml.Serialization.XmlElementAttribute("lat")]
    public double lattitude { get; set; }
    [System.Xml.Serialization.XmlElementAttribute("lon")]
    public double longitude { get; set; }

    [System.Xml.Serialization.XmlElement("ele")]
    public int elapsed { get; set; }

    [System.Xml.Serialization.XmlElement("time")]
    public DateTime dateTime { get; set; }
}

我没有仔细检查过这个例子,所以请谨慎使用。您也可以使用.NET XML Reader库并手动设置每个对象属性。

您还可以阅读有关XML herehere的反序列化的更多信息。

然后只是使用新创建的对象来填充DataTable。它是你填充DataTable的方式,但你可以这样做:

gpx myObject = deserialseGPXFile(); // example
DataTable table = new DataTable();

table.Columns.Add("lat", typeof(double));
table.Columns.Add("lon", typeof(double)); 

foreach (TrackPart tPart in myObject.TrackCollection)
{
    table.Rows.Add(tPart.lattitude, tPart.longitude);
}

答案 1 :(得分:0)

此功能将为您提供帮助。 您可以根据项目需要修改代码。

internal static DataTable ReadGpxFile(string gpxfile)
    {
        AFolderFiles.AFolderFilesPermission.AddFolderSecurity(gpxfile);
        DataTable table = new DataTable("gpxfile");
        table.Columns.Add("ident", typeof(string));
        table.Columns.Add("lat", typeof(string));
        table.Columns.Add("long", typeof(string));
        table.Columns.Add("time", typeof(string));
        XmlDocument gpxDoc = new XmlDocument();
        gpxDoc.Load(gpxfile);
        XmlNamespaceManager nsmgr = new XmlNamespaceManager(gpxDoc.NameTable);
        nsmgr.AddNamespace("x", "http://www.topografix.com/GPX/1/1");
        XmlNodeList nl = gpxDoc.SelectNodes("//x:trkpt", nsmgr);
        foreach (XmlElement xelement in nl)
        {
            DataRow dataRow = table.NewRow();
            dataRow[0] = string.IsNullOrEmpty(xelement.GetAttribute("ident")) == true ? "GPXFILE" : xelement.GetAttribute("ident");
            dataRow[1] = xelement.GetAttribute("lat");
            dataRow[2] = xelement.GetAttribute("lon");
            dataRow[3] = xelement.GetAttribute("time");
            table.Rows.Add(dataRow);
        }
        return table;
    }