我有一个XML文件,其中包含一系列元素,如下所示:
<trkpt lat="42.403128" lon="-71.084654">
<ele>12.153809</ele>
<time>2002-03-11T20:49:26Z</time>
<sym>Waypoint</sym>
</trkpt>
我正在使用以下代码获取lat
和lon
属性并将其添加到列表中:
XDocument doc = XDocument.Load(filename);
XElement trkseg = doc.Descendants().Where(x => x.Name.LocalName == "trkseg").FirstOrDefault();
XNamespace ns = trkseg.Name.Namespace;
var l_l = trkseg.Elements(ns + "trkpt").Select(x => new
{
lat = x.Attribute("lat").Value,
lon = x.Attribute("lon").Value
}).ToList();
上面的代码按预期工作。我得到一个包含lat
和lon
值的字符串列表。到目前为止我们还不错。
当我尝试获取<time>
元素的值时,问题就会进入。我尝试了以下几种不同的变体,但无济于事:
lat = x.Attribute("lat").Value,
lon = x.Attribute("lon").Value,
time = x.Descendants("time").Elements().FirstOrDefault().Value
我的所有尝试都导致time
成为null
。如何获取<time>
元素的值?
答案 0 :(得分:0)
不确定这是否适用于您的整个解决方案,但根据您提供的内容,我能够将其付诸实践:
XDocument doc = XDocument.Load("XMLFile1.xml");
XElement trkseg = doc.Descendants().Where(x => x.Name.LocalName == "trkseg").FirstOrDefault();
XNamespace ns = trkseg.Name.Namespace;
var l_l = trkseg.Elements(ns + "trkpt").Select(x => new
{
lat = x.Attribute("lat").Value,
lon = x.Attribute("lon").Value,
time = x.Element("time").Value
}).ToList();
XML过于复杂很容易(我从个人经验中说出来);在这种情况下,当你已经处于你需要的xml级别时,看起来你正在挖掘比你需要的更多。
这是我得到的输出:
{ lat = "42.403128", lon = "-71.084654", time = "2002-03-11T20:49:26Z" }
答案 1 :(得分:0)
尽管元素没有名称空间前缀,但从ns
用于访问trkpt
元素判断,我相信您的XML在trkpt
元素级别之上的某个地方具有默认名称空间。在这种情况下,time
元素会继承与trkpt
相同的命名空间,因此您可能会错过XNamespace
:
time = x.Element(ns+"time").Value