You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:15:04