2016-04-26 2 views
0

В нижеприведенном XML-файле я пытаюсь получить все элементы trkpt, чтобы выполнить задачу с помощью значений атрибутов /lon. Я думал, что LINQ to XML будет самым простым способом, но я не могу получить никаких результатов для возврата в цикле . Что я делаю не так?Как выбрать элементы в XDocument?

Этот код находится в методе Main() из консольного приложения: данные

var filename = @"C:\temp\sample_output.gpx"; 

var xDoc = XDocument.Load(filename); 

XNamespace xmlns = "http://www.topografix.com/GPX/1/1"; 
XNamespace gpxtpx = "http://www.garmin.com/xmlschemas/TrackPointExtension/v1"; 
XNamespace wptx1 = "http://www.garmin.com/xmlschemas/WaypointExtension/v1"; 
XNamespace gpxx = "http://www.garmin.com/xmlschemas/GpxExtensions/v3"; 
XNamespace gpxtrkx = "http://www.garmin.com/xmlschemas/TrackStatsExtension/v1"; 

foreach (var item in xDoc.Descendants(gpxtpx + "trkpt")) 
{ 
    Console.WriteLine(item.Element(gpxtpx + "trkpt").Value); 
} 

Console.Read(); 

XML Я пытаюсь обработать с указанным кодом. Изменены значения Lat/Lon.

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
    <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" 
creator="Oregon 600" version="1.1" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
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>2016-04-18T01:19:07Z</time> 
     </metadata> 
     <trk> 
      <name>2016-04-17 20:19:01</name> 
      <extensions> 
       <gpxx:TrackExtension> 
        <gpxx:DisplayColor>Magenta</gpxx:DisplayColor> 
       </gpxx:TrackExtension> 
      </extensions> 
      <trkseg> 
       <trkpt lat="44.123" lon="-89.123"> 
        <ele>343.61</ele> 
        <time>2016-04-17T22:53:34Z</time> 
       </trkpt> 
       <trkpt lat="44.123" lon="-89.123"> 
        <ele>343.58</ele> 
        <time>2016-04-17T22:53:35Z</time> 
       </trkpt> 
       <trkpt lat="44.123" lon="-89.123"> 
        <ele>343.56</ele> 
        <time>2016-04-17T22:53:36Z</time> 
       </trkpt> 
       <trkpt lat="44.123" lon="-89.123"> 
        <ele>343.55</ele> 
        <time>2016-04-17T22:53:37Z</time> 
       </trkpt> 
       <trkpt lat="44.123" lon="-89.123"> 
        <ele>343.62</ele> 
        <time>2016-04-17T22:53:38Z</time> 
       </trkpt> 
      </trkseg> 
     </trk> 
    </gpx> 

ответ

4

Вы используете неправильное пространство имен. Пространство имен по умолчанию элементов (в том числе trkpt) является http://www.topografix.com/GPX/1/1, в связи с этим:

xmlns="http://www.topografix.com/GPX/1/1" 

Я настоятельно рекомендую вам изменить имя переменной gpxNs, чтобы указать его значение, а затем использовать его:

XNamespace gpxNs = "http://www.topografix.com/GPX/1/1"; 
... 
foreach (var item in xDoc.Descendants(gpxNs + "trkpt")) 
+1

аналогичный, но более сложный вопрос, не могли бы вы на это смотрите? [Ссылка] (http://stackoverflow.com/questions/36898195/c-sharp-getting-a-specific-attribute-of-a-child-of-a-previous-node-in-xml-while) – ib11

0

вы можете сделать это с 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\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 

      XElement trkseg = doc.Descendants().Where(x => x.Name.LocalName == "trkseg").FirstOrDefault(); 
      XNamespace ns = trkseg.Name.Namespace; 

      var l_l = trkseg.Elements(ns + "trkpt").Select(x => new 
      { 
       lat = x.Attribute("lat").Value, 
       lon = x.Attribute("lon").Value 
      }).ToList(); 

     } 
    } 
} 
Смежные вопросы