VB.Net GPX 到数据表

Posted

技术标签:

【中文标题】VB.Net GPX 到数据表【英文标题】:VB.Net GPX to Datatable 【发布时间】:2021-11-20 10:43:03 【问题描述】:

我正在尝试将 GPX 文件转换为数据表,但似乎真的在努力解决这个问题。 GPX 文件只是 GPS 数据的 XML。我已经设法将文件的 URI 放入带有对话框的变量中。

这是我尝试加载的 GPX 文件(尽管点数有所减少):

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<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"
xmlns:badelf="http://bad-elf.com/xmlschemas"
version="1.1"
creator="Bad Elf GPS Pro+ 2.1.50"
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 http://bad-elf.com/xmlschemas http://bad-elf.com/xmlschemas/GpxExtensionsV1.xsd">
    <metadata>
    <extensions>
    <badelf:modelNickname>BE021</badelf:modelNickname>
    <badelf:modelSerialNumber>011215</badelf:modelSerialNumber>
    <badelf:modelName>Bad Elf GPS Pro+</badelf:modelName>
    <badelf:modelNumber>BE-GPS-2300</badelf:modelNumber>
    <badelf:modelHardwareRevision>8.0.0</badelf:modelHardwareRevision>
    <badelf:modelFirmwareRevision>2.1.50</badelf:modelFirmwareRevision>
    <badelf:elevationSource>gps</badelf:elevationSource>
    </extensions>
    </metadata>
    <wpt lat="50.650192" lon="-1.186149">
    <ele>10.3</ele>
    <time>2021-07-24T14:47:40Z</time>
    <name>START (2021-07-24T14:47:40Z)</name>
    </wpt>
    <trk>
    <name>2021-07-24T14:47:40Z</name>
    <trkseg>
    <trkpt lat="50.650192" lon="-1.186149"><ele>10.3</ele><time>2021-07-24T14:47:40Z</time><hdop>0.9</hdop><extensions><badelf:speed>0.00</badelf:speed><badelf:baroEle>52.4</badelf:baroEle><badelf:baroPress>1005.81</badelf:baroPress></extensions></trkpt>
    <trkpt lat="50.650195" lon="-1.186144"><ele>8.8</ele><time>2021-07-24T14:47:41Z</time><hdop>0.9</hdop><extensions><badelf:speed>0.00</badelf:speed><badelf:baroEle>52.4</badelf:baroEle><badelf:baroPress>1005.81</badelf:baroPress></extensions></trkpt>
    <trkpt lat="50.650193" lon="-1.186146"><ele>8.9</ele><time>2021-07-24T14:47:41Z</time><hdop>0.9</hdop><extensions><badelf:speed>0.00</badelf:speed><badelf:baroEle>52.4</badelf:baroEle><badelf:baroPress>1005.81</badelf:baroPress></extensions></trkpt>
    </trkseg>
    </trk>
    <wpt lat="50.650168" lon="-1.186119">
    <ele>13.4</ele>
    <time>2021-07-24T15:52:30Z</time>
    <name>END (2021-07-24T15:52:30Z)</name>
    </wpt>
    </gpx>

我想要将 badelf:modelNickname 提取到一个变量中,然后制作一个列标题为“lat”“lon”“ele”“time”“hdop”“badelf:speed”和“badelf:baropressure”的数据表"

有人可以帮我在 VB.Net 中做到这一点吗?甚至是我可能翻译的 C#。

【问题讨论】:

当您说数据表时,您的意思是内存中(没有数据库)DataTable,因此您可以将其附加到网格,还是要将其插入数据库?跨度> 是的,内存数据表。稍后我会在修剪数据时将其写入 SQL Express。我已经设法将xml读入数据集,但这感觉很混乱,并且可能只适用于这个确切的模式。不同的 GPS 可能会产生不同的结果。 【参考方案1】:

如果您想在没有库帮助您提取 XML 的情况下执行此操作,您可以使用 this SO post 中的 Dmitry Bychenko 建议,该建议显示了如何在两个“单词”之间获取子字符串。

由于您的参数将始终具有相同的名称,您可以将他示例中的单词替换为每个参数行的开头和结尾。

这就是您可以将 badelf:modelNickname 提取到变量的方法。

至于你的数据表,我不确定你用什么填充它,但如果你只需要一个包含这些列的数据表,你可以像@RKK's answer on this SO Post 那样做:

Dim dt As New DataTable

dt.Columns.Add("Id", GetType(Integer))
dt.Columns.Add("FirstName", GetType(String))
dt.Columns.Add("LastName", GetType(String))

dt.Rows.Add(1, "Test", "data")
dt.Rows.Add(15, "Robert", "Wich")
dt.Rows.Add(18, "Merry", "Cylon")
dt.Rows.Add(30, "Tim", "Burst")

让我知道这是否能让你更接近你的目标。

【讨论】:

【参考方案2】:

没有任何开源项目已经这样做了。所以我可以提供一些很好的例子,你可以考虑并从中提取代码。两者都需要一些发展。

来自 Microsoft 的 Jim Jackson 有一个很好的 blog post on March 11, 2009,其中加载了很好的源代码,展示了如何使用 LINQ 从 GPX 文件中查询各种元素。

GpxReader 是来自 DLC 的开源库。它有一些从 gpx 文件中提取元素的好例子。底部的评论为下一步提供了一些好主意。

您可以使用其中任何一个来提取您想要的元素并将它们插入数据表等。代码示例使用 C#,但可以使用流行的(在线)代码转换器之一转换为 VB.NET . VB.NET 中的 LINQ 有时会有点尴尬。这取决于您的技能/经验。

【讨论】:

嗨。谢谢你回到我身旁。我非常业余,所以 LINQ 对我来说可能不是最好的解决方案。我会看看 GpxReader 看看是否有帮助。自发布以来,我设法将文件读取到数据集中,然后将数据从数据集中提取到单个数据表中。唯一的缺点是我确信数据最终的表号会因架构而异,因此我的解决方案可能只适用于这个确切的架构。

以上是关于VB.Net GPX 到数据表的主要内容,如果未能解决你的问题,请参考以下文章

vb.net Datagridview添加行

VB.NET 从 DataTable 对象将表附加到数据库

在 gpx 文件上执行 Dijkstra

将数据从 Excel 复制到 SQL 数据库 VB.NET

如何将新行添加到数据表 vb.net

VB6/Microsoft Access/DAO 到 VB.NET/SQL Server... 有建议吗?