如果有人告诉我是否有办法将GPX文件导入C#数据表,我将不胜感激。 我用Google搜索了很多次但是徒劳无功。
答案 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 here和here的反序列化的更多信息。
然后只是使用新创建的对象来填充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;
}