You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 10:36:00