解析XML文件的特定部分

问题描述:

我有下面的示例有.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(); 

我只是不知道如何解决它。

由于您从不声明名称空间(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