2013-06-12 72 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 to 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