【发布时间】: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。
标签: c# xml linq linq-to-xml