Jonnie
Jonnie

Reputation: 131

Reading in XML from WPF c#

I'm struggling to read in a "GPX" file to a WPF (c#) project. Sample GPX is provided below. I've tried a number of different options with the same result.

Document is loading ok, but I'm unable to break it down to access the Nodes Directly.

Any help would be greatly appreciated.

Thanks.

private void Simple_Click(object sender, RoutedEventArgs e)
{
  XmlDocument xml = new XmlDocument();
  xml.Load(@"C:\Users\Jonathon\Desktop\GPX_Data.gpx");
  XmlNodeList nodes = xml.SelectNodes("trkpt"); // have tried: double '/' to get nodes at any level (XPath syntax)        
  //XmlNodeList nodes = xml.SelectNodes("/gpx/trk/trkseg/trkpt");

  int count = 0;

  foreach (XmlNode xn in nodes)
  {
     count++;
     }

  }
}

Sample GPX File

<?xml version="1.0" encoding="UTF-8"?>
<gpx version="1.1" creator="Endomondo.com"  
     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" 
    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">
  <metadata>
    <author>
      <name>Jonathon Ralfe</name>
      <email id="jonathon" domain="ralfe.net"/>
    </author>
    <link href="http://www.endomondo.com">
      <text>Endomondo</text>
</link>
<time>2015-01-27T18:31:26Z</time>
  </metadata>
  <trk>
    <src>http://www.endomondo.com/</src>
    <link href="https://www.endomondo.com/workouts/463986953/2256850">
      <text>endomondo</text>
    </link>
    <type>SKIING_DOWNHILL</type>
    <trkseg>
      <trkpt lat="45.576892" lon="6.894079">
        <time>2015-01-26T09:49:57Z</time>
      </trkpt>
      <trkpt lat="45.576892" lon="6.894079">
        <ele>1595.0</ele>
        <time>2015-01-26T09:49:59Z</time>
      </trkpt>
      <trkpt lat="45.577109" lon="6.893946">
        <ele>1581.0</ele>
        <time>2015-01-26T09:51:46Z</time>
      </trkpt>
      <trkpt lat="45.5772" lon="6.894084">
        <ele>1575.0</ele>
        <time>2015-01-26T09:52:02Z</time>
      </trkpt>
      <trkpt lat="45.577247" lon="6.894212">
        <ele>1577.0</ele>
        <time>2015-01-26T09:52:05Z</time>
      </trkpt>
      <trkpt lat="45.577317" lon="6.89452">
        <ele>1589.0</ele>
        <time>2015-01-26T09:52:11Z</time>
      </trkpt>

Upvotes: 0

Views: 631

Answers (2)

JohnnyQ
JohnnyQ

Reputation: 1611

By XPath selection:

foreach(XElement aElement in xml.XPathSelectElements("/trk/trkseg").Elements())
{

      foreach(XNode aXNode in aElement.Nodes())
      {
         //Access subnodes of trkpt
      }
}

Upvotes: 0

Andrey Korneyev
Andrey Korneyev

Reputation: 26846

That's because your xml contains namespaces, so you have to set namespace when querying data.

Consider this approach:

XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);
nsmgr.AddNamespace("x", "http://www.topografix.com/GPX/1/1");
XmlNodeList nodes = xml.SelectNodes("//x:trkpt", nsmgr);

Here we're creating NamespaceManager, setting namespace according to your data xmlns="http://www.topografix.com/GPX/1/1" attribute and using this namespace in XPath.

Upvotes: 2

Related Questions