VB.Net实现GPX文件转DataTable并提取badelf自定义字段求助
GPX文件转DataTable实现代码
核心说明:
- 适配你提供的GPX 1.1 结构,包含Bad Elf扩展字段解析逻辑
- 已处理XML命名空间匹配问题,可直接命中目标节点
C# 实现代码
using System.Data; using System.Xml; // 你的GPX文件路径/URI存储在字符串变量 gpxUri 中 XmlDocument gpxDoc = new XmlDocument(); gpxDoc.Load(gpxUri); // 注册命名空间 XmlNamespaceManager nsMgr = new XmlNamespaceManager(gpxDoc.NameTable); nsMgr.AddNamespace("g", "http://www.topografix.com/GPX/1/1"); nsMgr.AddNamespace("badelf", "http://bad-elf.com/xmlschemas"); // 提取badelf:modelNickname string modelNickname = gpxDoc.SelectSingleNode("/g:gpx/g:metadata/g:extensions/badelf:modelNickname", nsMgr)?.InnerText ?? string.Empty; // 初始化DataTable DataTable gpsTable = new DataTable(); gpsTable.Columns.AddRange(new DataColumn[] { new DataColumn("lat", typeof(double)), new DataColumn("lon", typeof(double)), new DataColumn("ele", typeof(double)), new DataColumn("time", typeof(DateTime)), new DataColumn("hdop", typeof(double)), new DataColumn("badelf:speed", typeof(double)), new DataColumn("badelf:baropressure", typeof(double)) }); // 解析所有轨迹点 XmlNodeList trackPoints = gpxDoc.SelectNodes("//g:trkpt", nsMgr); foreach (XmlNode pt in trackPoints) { DataRow row = gpsTable.NewRow(); row["lat"] = Convert.ToDouble(pt.Attributes["lat"].Value); row["lon"] = Convert.ToDouble(pt.Attributes["lon"].Value); row["ele"] = Convert.ToDouble(pt.SelectSingleNode("g:ele", nsMgr)?.InnerText ?? "0"); row["time"] = Convert.ToDateTime(pt.SelectSingleNode("g:time", nsMgr)?.InnerText); row["hdop"] = Convert.ToDouble(pt.SelectSingleNode("g:hdop", nsMgr)?.InnerText ?? "0"); row["badelf:speed"] = Convert.ToDouble(pt.SelectSingleNode("g:extensions/badelf:speed", nsMgr)?.InnerText ?? "0"); row["badelf:baropressure"] = Convert.ToDouble(pt.SelectSingleNode("g:extensions/badelf:baroPress", nsMgr)?.InnerText ?? "0"); gpsTable.Rows.Add(row); }
VB.NET 实现代码
Imports System.Data Imports System.Xml ' 你的GPX文件路径/URI存储在字符串变量 gpxUri 中 Dim gpxDoc As New XmlDocument() gpxDoc.Load(gpxUri) ' 注册命名空间 Dim nsMgr As New XmlNamespaceManager(gpxDoc.NameTable) nsMgr.AddNamespace("g", "http://www.topografix.com/GPX/1/1") nsMgr.AddNamespace("badelf", "http://bad-elf.com/xmlschemas") ' 提取badelf:modelNickname Dim modelNickname As String = If(gpxDoc.SelectSingleNode("/g:gpx/g:metadata/g:extensions/badelf:modelNickname", nsMgr)?.InnerText, String.Empty) ' 初始化DataTable Dim gpsTable As New DataTable() gpsTable.Columns.AddRange(New DataColumn() { New DataColumn("lat", GetType(Double)), New DataColumn("lon", GetType(Double)), New DataColumn("ele", GetType(Double)), New DataColumn("time", GetType(DateTime)), New DataColumn("hdop", GetType(Double)), New DataColumn("badelf:speed", GetType(Double)), New DataColumn("badelf:baropressure", GetType(Double)) }) ' 解析所有轨迹点 Dim trackPoints As XmlNodeList = gpxDoc.SelectNodes("//g:trkpt", nsMgr) For Each pt As XmlNode In trackPoints Dim row As DataRow = gpsTable.NewRow() row("lat") = Convert.ToDouble(pt.Attributes("lat").Value) row("lon") = Convert.ToDouble(pt.Attributes("lon").Value) row("ele") = Convert.ToDouble(If(pt.SelectSingleNode("g:ele", nsMgr)?.InnerText, "0")) row("time") = Convert.ToDateTime(pt.SelectSingleNode("g:time", nsMgr)?.InnerText) row("hdop") = Convert.ToDouble(If(pt.SelectSingleNode("g:hdop", nsMgr)?.InnerText, "0")) row("badelf:speed") = Convert.ToDouble(If(pt.SelectSingleNode("g:extensions/badelf:speed", nsMgr)?.InnerText, "0")) row("badelf:baropressure") = Convert.ToDouble(If(pt.SelectSingleNode("g:extensions/badelf:baroPress", nsMgr)?.InnerText, "0")) gpsTable.Rows.Add(row) Next
内容的提问来源于stack exchange,提问作者mbs485184
相关产品推荐
相关产品推荐

