我如何获得" HR"和" Cad"以下XML文件中的节点:
<?xml version="1.0" encoding="UTF-8"?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creator="StravaGPX" 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://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd">
<metadata>
<time>2011-07-16T13:39:22Z</time>
</metadata>
<trk>
<name>07/16/2011 Toronto, ON, Canada</name>
<trkseg>
<trkpt lat="43.7076220" lon="-79.3164530">
<ele>138.4</ele>
<time>2011-07-16T13:39:22Z</time>
<extensions>
<gpxtpx:TrackPointExtension>
<gpxtpx:hr>124</gpxtpx:hr>
<gpxtpx:cad>90</gpxtpx:cad>
</gpxtpx:TrackPointExtension>
</extensions>
</trkpt>
</trkseg>
</trk>
</gpx>
我可以使用以下代码解析该元素:
loaded.Descendants("{http://www.topografix.com/GPX/1/1}trkpt") // Where 'loaded' is the XDocument
但是当我查看调试器中的元素时,它只向我显示<ele>
和<time>
元素,并忽略作为后代的<TrackPointExtension>
和<extension>
元素。 / p>
提前谢谢!
答案 0 :(得分:1)
如何使用调试器进行检查并不是很清楚,但据我所知,调试器不应忽略所选节点的后代。
要从具有多个名称空间前缀的XML中选择元素,您只需要为右元素使用右XNamespace
前缀,例如:
XNamespace ns = "http://www.topografix.com/GPX/1/1";
XNamespace gpx = "http://www.garmin.com/xmlschemas/TrackPointExtension/v1";
var trackPointExt = doc.Root
.Element(ns+"trk")
.Element(ns+"trkseg")
.Element(ns+"trkpt")
.Element(ns+"extensions")
.Element(gpx+"TrackPointExtension");
var hr = (int)trackPointExt.Element(gpx+"hr");
var cad = (int)trackPointExt.Element(gpx+"cad");
Console.WriteLine(hr);
Console.WriteLine(cad);