Reputation: 100
How would I get the XElement for the "HR" and "Cad" nodes in the following XML file:
<?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>
I can resolve the element with the following code:
loaded.Descendants("{http://www.topografix.com/GPX/1/1}trkpt") // Where 'loaded' is the XDocument
but when I look at the element in the debugger it only shows me the <ele>
and <time>
elements and ignores the <TrackPointExtension>
and <extension>
elements that are descendants.
Thx in advance!
Upvotes: 2
Views: 124
Reputation: 89305
It isn't very clear how you used debugger to check, but as far as I can see there should be no descendant of selected node ignored by debugger.
To select an element from XML having multiple namespace prefixes, you just need to use right XNamespace
prefix for right element, for example :
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);
Upvotes: 1