如何获取后代元素的值?

How do I get the value of a descendant element?

我有一个 XML 文件,其中包含一系列如下元素:

<trkpt lat="42.403128" lon="-71.084654">
    <ele>12.153809</ele>
    <time>2002-03-11T20:49:26Z</time>
    <sym>Waypoint</sym>
</trkpt>

我正在使用以下代码获取 latlon 属性并将它们添加到列表中:

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();

以上代码按预期工作。我得到一个包含 latlon 值的字符串列表。到目前为止我们都很好。

当我尝试获取 <time> 元素的值时出现问题。我尝试了以下几种不同的变体,但无济于事:

lat = x.Attribute("lat").Value,
lon = x.Attribute("lon").Value,
time = x.Descendants("time").Elements().FirstOrDefault().Value

我所有的尝试都导致 time 成为 null。如何获取 <time> 元素的值?

不确定这是否适用于您的整个解决方案,但根据您提供的内容,我能够让它发挥作用:

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" }

ns 用于访问 trkpt 元素来看,尽管该元素没有名称空间前缀,但我相信您的 XML 在 trkpt 元素上方某处具有默认名称空间等级。在这种情况下,time 元素继承与 trkpt 相同的名称空间,因此您可能只是缺少 XNamespace :

time = x.Element(ns+"time").Value