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

Posted

技术标签:

【中文标题】无法使用 LINQ 解析 XML 文件中的属性【英文标题】:Cannot parse attribute in XML file using LINQ 【发布时间】:2021-10-08 01:42:24 【问题描述】:

我正在尝试解析一个 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>
  ....

我的代码 sn-p 看起来像这样:

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) 的虚拟位置,整个文件将正确解析)。 我应该如何编码属性值?

【问题讨论】:

与元素不同,属性默认不在命名空间中,因此将trackPointElement.Attribute(ns1 + "lat")替换为trackPointElement.Attribute("lat")"lon"也是如此。 你也可以用(double)trackPointElement.Attribute("lat")代替Convert.ToDouble 【参考方案1】:

与元素不同,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:

无前缀属性名称的命名空间名称始终没有值。

我还建议将Convert.ToDouble() 替换为XmlConvert.ToDouble(),以确保跨语言环境一致地解析XML。或者使用 juharr 在 cmets 中提到的 explicit conversion to double,它做同样的事情。

【讨论】:

以上是关于无法使用 LINQ 解析 XML 文件中的属性的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate & Linq - “无法解析属性”

无法解析属性“src”中的可绘制对象

导入 XML 时无法从属性文件中解析占位符

C# Linq to XML 读取多个带有属性的标签

解析后无法取消列出 XML 文件

无法从父 pom.xml 解析子 pom.xml 中的 $project.version