public static List<Track> ParseGpx(string filename, Stream data) { var doc = XDocument.Load(data); var xn = doc.Root.Name.Namespace; List<Track> tracks = new List<Track>(); // Read 'trk' elements. Could also read 'wpt' and 'rte' foreach (var trk in doc.Root.Elements(xn + "trk")) { var newDoc = new XDocument(doc); newDoc.Declaration = new XDeclaration(doc.Declaration); newDoc.Root.ReplaceNodes(new XElement(trk)); var newTrack = new Track { SourceFile = filename, Data = newDoc.ToString(), Name = trk.Element(xn + "name").Value }; var points = newTrack.GetPoints(); if (points.Length > 10) tracks.Add(newTrack); } return tracks; }