2013-06-12 3 views
1

У меня есть .gpx XML-файл со следующим образцом:Синтаксических определенная часть файла XML

<trk> 
    <name>Test</name> 
    <trkseg> 
     <trkpt lon="-84.89032996818423" lat="32.75810896418989"> 
     <ele>225.0</ele> 
     <time>2011-04-02T11:57:48.000Z</time> 
     <extensions> 
      <gpxtpx:TrackPointExtension> 
      <gpxtpx:cad>0</gpxtpx:cad> 
      </gpxtpx:TrackPointExtension> 
     </extensions> 
     </trkpt> 
    </trkseg> 
</trk> 

Я использую Linq для XML, чтобы разобрать это, но у меня трудное время разбора раздела расширений , Вот код, я использую:

var gpxDoc = LoadFromStream(document); 
var gpx = GetGpxNameSpace(); 
var gpxtpx = XNamespace.Get("gpxtpx"); 

var tracks = from track in gpxDoc.Descendants(gpx + "trk") 
    select new 
    { 
     Name = DefaultStringValue(track, gpx, "name"), 
     Description = DefaultStringValue(track, gpx, "desc"), 
     Segments = (from trkSegment in track.Descendants(gpx + "trkseg") 
      select new 
      { 
      TrackSegment = trkSegment, 
      Points = (from trackpoint in trkSegment.Descendants(gpx + "trkpt") 
       select new 
       { 
       Lat = Double(trackpoint.Attribute("lat").Value), 
       Lng = Double(trackpoint.Attribute("lon").Value), 
       Ele = DefaultDoubleValue(trackpoint, gpx, "ele"), 
       Time = DefaultDateTimeValue(trackpoint, gpx, "time"), 
       Extensions = (
        from ext in trackpoint.Descendants(gpx + "extensions").Descendants(gpxtpx + "TrackPointExtension") 
        select new 
        { 
        Cad = DefaultIntValue(ext, gpxtpx, "cad") 
        }).SingleOrDefault() 
       }) 
      }) 
    }; 

Вот соответствующий вспомогательный код:

private static double? DefaultIntValue(XContainer element, XNamespace ns, string elementName) 
{ 
    var xElement = element.Element(ns + elementName); 
    return xElement != null ? Convert.ToInt32(xElement.Value) : (int?)null; 
} 

private XNamespace GetGpxNameSpace() 
{ 
    var gpx = XNamespace.Get("http://www.topografix.com/GPX/1/1"); 
    return gpx; 
} 

Фактическая ошибка, я получаю

произошла следующая ошибка: Ссылка на объект не установить экземпляр объекта.

и это бомбы на этот код:

Extensions = (from ext in trackpoint.Descendants(gpx + "extensions").Descendants(gpxtpx + "TrackPointExtension") 
    select new 
    { 
    Cad = DefaultIntValue(ext, gpxtpx, "cad") 
    }).SingleOrDefault(); 

Я просто не знаю, как это исправить.

ответ

0

Поскольку вы никогда не объявляете пространство имен (xmlns:gpxtpx="http://www.topografix.com/GPX/1/1"), оно никогда не будет соответствовать. Предоставленный вами xml-фрагмент плохо сформирован из-за отсутствия пространства имен.

Если фрагмент, опубликованный в блоке, вырезается из более крупного документа, рассмотрите возможность переключения на XML API, а не на манипуляции с строкой. Если это цельность из XML вы получаете от внешней системы, добавьте его в корневой узел, который вы можете объявить схему в:

<root xmlns:gpxtpx="http://www.topografix.com/GPX/1/1"> 
    <!-- put your xml fragment here --> 
</root> 
+0

Файл действительно имеет Xmlns: gpxtpx = "HTTP: // WWW. garmin.com/xmlschemas/TrackPointExtension/v1 ". – Mike

+0

Вот и все! Я изменил его на var gpxtpx = XNamespace.Get («http://www.garmin.com/xmlschemas/TrackPointExtension/v1»); и это сработало. Благодаря! – Mike

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

  • Нет связанных вопросов^_^