无法使用 LINQ 解析 XML 文件中的属性

Cannot parse attribute in XML file using LINQ

我正在尝试解析一个 XML 文件,使用的方法是我从其他地方复制的,并且适用于 XML,它只有没有属性的元素,但因属性而失败。示例 XML 如下所示:

<name>tester</name>
<trkseg>
  <trkpt lat="50.26241" lon="-5.05005">
    <ele>6.9</ele>
  </trkpt>
  <trkpt lat="50.26242" lon="-5.05012">
    <ele>6.9</ele>
  </trkpt>
  ....

我的代码片段如下所示:

IEnumerable<Track> tracks =
    from trackElement in root.Descendants(ns1 + "trkseg")
    select new Track
    {
        TrackPoints =
            (from trackPointElement in trackElement.Descendants(ns1 + "trkpt")
             select new TrackPoint
             {
                 pos = new Position
                 {
                     LatitudeDegrees = Convert.ToDouble(trackPointElement.Attribute(ns1 + "lat").Value),
                     LongitudeDegrees = Convert.ToDouble(trackPointElement.Attribute(ns1 + "lon").Value),

                 },
                 AltitudeMeters = trackPointElement.Element(ns1 + "ele") != null
                                 ? Convert.ToDouble(trackPointElement.Element(ns1 + "ele").Value) : 0.0,
             }).ToList()
    };

但我在属性上遇到空异常(“System.Xml.Linq.XElement.Attribute(...) 返回空值”)。正确找到了 'ele' 元素和 'name' 元素(如果我只是创建一个 (0,0) 的虚拟位置,整个文件就会正确解析)。 我应该如何编码属性值?

与元素不同,XML 属性默认情况下从不在命名空间中,因此将 trackPointElement.Attribute(ns1 + "lat") 替换为 trackPointElement.Attribute("lat"):

pos = new Position
{
    LatitudeDegrees = XmlConvert.ToDouble(trackPointElement.Attribute("lat").Value),
    LongitudeDegrees = XmlConvert.ToDouble(trackPointElement.Attribute("lon").Value),
}

确认见 Namespaces in XML 1.0 (Third Edition): 6.2 Namespace Defaulting:

The namespace name for an unprefixed attribute name always has no value.

我还建议将 Convert.ToDouble() 替换为 XmlConvert.ToDouble() to ensure that the XML is parsed consistently across locales. Or use the explicit conversion to double as mentioned in comments by juharr,后者的作用相同。