如何获取后代元素的值?
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>
我正在使用以下代码获取 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>
元素的值?
不确定这是否适用于您的整个解决方案,但根据您提供的内容,我能够让它发挥作用:
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
我有一个 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>
元素的值?
不确定这是否适用于您的整个解决方案,但根据您提供的内容,我能够让它发挥作用:
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