无法使用 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 文件中的属性的主要内容,如果未能解决你的问题,请参考以下文章