使用LINQ解析XML文件时读取属性返回null报错问题咨询
问题根因
XML规范中,没有显式添加命名空间前缀的属性,不属于任何命名空间。你代码里给lat和lon属性也拼接了命名空间前缀ns1,自然匹配不到对应的属性,就会返回null,调用.Value的时候就触发空引用异常。
而你之前能正常读取trkseg、trkpt、ele这些元素,是因为这些元素属于ns1对应的命名空间,和属性的命名空间规则不一样。
修复后的代码
首先把属性读取的ns1 +去掉,建议同时加上空值兼容处理,避免部分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("lat")?.Value ?? "0"), LongitudeDegrees = Convert.ToDouble(trackPointElement.Attribute("lon")?.Value ?? "0"), }, AltitudeMeters = trackPointElement.Element(ns1 + "ele") != null ? Convert.ToDouble(trackPointElement.Element(ns1 + "ele").Value) : 0.0, }).ToList() };
如果你的XML里明确保证所有trkpt都有lat和lon属性,也可以简化成直接读取:
LatitudeDegrees = Convert.ToDouble(trackPointElement.Attribute("lat").Value), LongitudeDegrees = Convert.ToDouble(trackPointElement.Attribute("lon").Value),
补充说明
只有遇到带命名空间前缀的属性(比如<trkpt gpx:lat="xxx">),才需要给Attribute方法传入对应命名空间的XName参数,常规无前缀的属性直接传字符串名称即可。
内容的提问来源于stack exchange,提问作者quilkin
相关产品推荐
相关产品推荐

