c# - 如何使用 XmlDocument 解析带有命名空间的 XML
问题描述
我在https://dotnetfiddle.net/ 上运行此代码 https://gist.github.com/ccumaya/10b1a58efe06c1f8080045457c5cf4b8 (该站点现在无法获取链接,所以我使用 gist。)
我的目的是获取 XML 文件中的 GPS 点,但是XPath
'/gpx/trk/trkseg/trkpt'
不起作用。我不知道哪里出错了,但我正在使用XPath
'//*'
并得到 1439 个结果。我需要帮助,谢谢你的指导。
xml结构如下。
<gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" xmlns:gpxtrkx="http://www.garmin.com/xmlschemas/TrackStatsExtension/v1" xmlns:wptx1="http://www.garmin.com/xmlschemas/WaypointExtension/v1" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creator="GPSMAP 64ST TWN" version="1.1" 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://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackStatsExtension/v1 http://www8.garmin.com/xmlschemas/TrackStatsExtension.xsd http://www.garmin.com/xmlschemas/WaypointExtension/v1 http://www8.garmin.com/xmlschemas/WaypointExtensionv1.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>2018-10-05T09:21:31Z</time>
</metadata>
<trk>
<name>2018-10-05 17:21:26</name>
<extensions>
<gpxx:TrackExtension>
<gpxx:DisplayColor>Cyan</gpxx:DisplayColor>
</gpxx:TrackExtension>
<gpxtrkx:TrackStatsExtension>
<gpxtrkx:Distance>1033</gpxtrkx:Distance>
<gpxtrkx:TotalElapsedTime>996</gpxtrkx:TotalElapsedTime>
<gpxtrkx:MovingTime>870</gpxtrkx:MovingTime>
<gpxtrkx:StoppedTime>86</gpxtrkx:StoppedTime>
<gpxtrkx:MovingSpeed>1</gpxtrkx:MovingSpeed>
<gpxtrkx:MaxSpeed>2</gpxtrkx:MaxSpeed>
<gpxtrkx:MaxElevation>207</gpxtrkx:MaxElevation>
<gpxtrkx:MinElevation>189</gpxtrkx:MinElevation>
<gpxtrkx:Ascent>17</gpxtrkx:Ascent>
<gpxtrkx:Descent>5</gpxtrkx:Descent>
<gpxtrkx:AvgAscentRate>0</gpxtrkx:AvgAscentRate>
<gpxtrkx:MaxAscentRate>0</gpxtrkx:MaxAscentRate>
<gpxtrkx:AvgDescentRate>0</gpxtrkx:AvgDescentRate>
<gpxtrkx:MaxDescentRate>-0</gpxtrkx:MaxDescentRate>
</gpxtrkx:TrackStatsExtension>
</extensions>
<trkseg>
<trkpt lat="25.0312615000" lon="121.3505846635">
<ele>189.04</ele>
<time>2018-10-05T09:04:55Z</time>
</trkpt>
<trkpt lat="25.0312520284" lon="121.3505897764">
<ele>189.04</ele>
<time>2018-10-05T09:04:57Z</time>
</trkpt>
<trkpt lat="25.0312457420" lon="121.3506018464">
<ele>196.43</ele>
<time>2018-10-05T09:04:59Z</time>
</trkpt>
<trkpt lat="25.0312426407" lon="121.3506035227">
<ele>196.42</ele>
<time>2018-10-05T09:05:01Z</time>
</trkpt>
</trkseg>
</trk>
</gpx>
感谢您的帮助
解决方案
如果您只需要纬度和经度,您可以使用 xml linq 轻松获取它,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\gps.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
XElement root = doc.Root;
XNamespace ns = root.GetDefaultNamespace();
var results = doc.Descendants(ns + "trkpt").Select(x => new
{
lat = x.Attribute("lat"),
lon = x.Attribute("lon"),
ele = (decimal)x.Element(ns + "ele"),
time = (DateTime)x.Element(ns + "time")
}).ToList();
}
}
}
推荐阅读
- c# - 按钮上的绑定命令不起作用 wpf mvvm
- python - 为什么 subprocess 会启动“额外”应用程序?
- c++ - Eclipse C++:致命错误:cheddar.h:没有这样的文件或目录
- css - CSS 模块和悬停 CSS 无法正常工作
- c# - 如何在不访问每个控制器中的 HttpContext 的情况下使所有控制器都可以使用会话变量?
- linux - 无法通过同一网络中的 IP 地址访问 nexus 服务器
- sql - SQL Server COUNT 多个表返回错误结果
- encryption - 使用 tiny-AES-c 进行加密无线链路
- bash - 获取主机名的一部分并在 bash 中的一行中替换一些字符
- javascript - 当我尝试保存在 MongoDB 中时,.then 未定义