如何获得后代元素的值?

时间:2016-07-20 00:29:21

标签: xml linq-to-xml

我有一个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>元素的值?

2 个答案:

答案 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