2013-12-24 119 views
0

在一个XML文档中,我有3个不同的元素,全部命名为“time”。如何选择此XML文档中的第三个元素? (名为时间),这样做只选择第一个:XDocument具有相同名称的多个元素

xDoc.Root.Element("forecast").Element("time").Element("temperature").Attribute("day").Value 

顺便说一句,名为“时代”的XML元素必须通过属性“节”连接到他们不同的日期,如果没有任何用处。

<time day="2013-12-23"> 
</time> 

<time day="2013-12-24"> 
</time> 
每个请求

整个XML:

<weatherdata> 
    <location> 
    <name>London</name> 
    <type/> 
    <country>GB</country> 
    <timezone/> 
    <location altitude="0" latitude="51.50853" longitude="-0.12574" geobase="geonames" geobaseid="0"/> 
    </location> 
    <credit/> 
    <meta> 
    <lastupdate/> 
    <calctime>0.0036</calctime> 
    <nextupdate/> 
    </meta> 
    <sun rise="2013-12-24T08:05:11" set="2013-12-24T15:55:37"/> 
    <forecast> 
    <time day="2013-12-23"> 
     <symbol number="501" name="moderate rain" var="10d"/> 
     <precipitation value="4" type="rain"/> 
     <windDirection deg="205" code="SSW" name="South-southwest"/> 
     <windSpeed mps="13.66" name="Strong breeze"/> 
     <temperature day="11.22" min="11.22" max="11.43" night="11.43" eve="11.22" morn="11.22"/> 
     <pressure unit="hPa" value="989.46"/> 
     <humidity value="94" unit="%"/> 
     <clouds value="overcast clouds" all="92" unit="%"/> 
    </time> 
    <time day="2013-12-24"> 
     <symbol number="501" name="moderate rain" var="10d"/> 
     <precipitation value="8.5" type="rain"/> 
     <windDirection deg="216" code="SW" name="Southwest"/> 
     <windSpeed mps="9.26" name="Fresh Breeze"/> 
     <temperature day="9.79" min="6.09" max="10.36" night="6.43" eve="6.09" morn="10.36"/> 
     <pressure unit="hPa" value="984.45"/> 
     <humidity value="97" unit="%"/> 
     <clouds value="overcast clouds" all="92" unit="%"/> 
    </time> 
    <time day="2013-12-25"> 
     <symbol number="500" name="light rain" var="10d"/> 
     <precipitation value="1" type="rain"/> 
     <windDirection deg="162" code="SSE" name="South-southeast"/> 
     <windSpeed mps="4.31" name="Gentle Breeze"/> 
     <temperature day="7.23" min="4.15" max="7.65" night="5.4" eve="6.98" morn="4.15"/> 
     <pressure unit="hPa" value="986.23"/> 
     <humidity value="100" unit="%"/> 
     <clouds value="scattered clouds" all="32" unit="%"/> 
    </time> 
    <time day="2013-12-26"> 
     <symbol number="802" name="scattered clouds" var="03d"/> 
     <precipitation/> 
     <windDirection deg="253" code="WSW" name="West-southwest"/> 
     <windSpeed mps="8.77" name="Fresh Breeze"/> 
     <temperature day="6.41" min="3.7" max="6.84" night="4.68" eve="5.06" morn="4.86"/> 
     <pressure unit="hPa" value="993.13"/> 
     <humidity value="92" unit="%"/> 
     <clouds value="scattered clouds" all="48" unit="%"/> 
    </time> 
    <time day="2013-12-27"> 
     <symbol number="501" name="moderate rain" var="10d"/> 
     <precipitation value="6" type="rain"/> 
     <windDirection deg="208" code="SSW" name="South-southwest"/> 
     <windSpeed mps="13.51" name="Strong breeze"/> 
     <temperature day="10.34" min="7.8" max="11.04" night="7.8" eve="8.81" morn="10.59"/> 
     <pressure unit="hPa" value="977.27"/> 
     <humidity value="93" unit="%"/> 
     <clouds value="scattered clouds" all="32" unit="%"/> 
    </time> 
    <time day="2013-12-28"> 
     <symbol number="800" name="sky is clear" var="01d"/> 
     <precipitation/> 
     <windDirection deg="261" code="W" name="West"/> 
     <windSpeed mps="3.47" name="Gentle Breeze"/> 
     <temperature day="7.92" min="2.36" max="7.92" night="2.36" eve="3.82" morn="7.02"/> 
     <pressure unit="hPa" value="1000.76"/> 
     <humidity value="82" unit="%"/> 
     <clouds value="sky is clear" all="0" unit="%"/> 
    </time> 
    <time day="2013-12-29"> 
     <symbol number="500" name="light rain" var="10d"/> 
     <precipitation value="0.46" type="rain"/> 
     <windDirection deg="263" code="W" name="West"/> 
     <windSpeed mps="6.9" name="Moderate breeze"/> 
     <temperature day="9.13" min="8" max="10.41" night="10.41" eve="8.79" morn="8"/> 
     <pressure unit="hPa" value="1013.2"/> 
     <humidity value="0" unit="%"/> 
     <clouds value="few clouds" all="17" unit="%"/> 
    </time> 
    </forecast> 
</weatherdata> 
+0

你可以张贴一些XML文档的?足以让其他人看到格式? –

+1

你可以使用'Elements(“Time”)。Skip(2).First()'或者那个效果,但是你确定它总是第三个元素?根据Xml中的相同值而不是元素的序号,您可能会更好。 – Pawel

+0

我得到一个InvalidOperationExeption。如果可能的话,它也可以按日期过去。 – Kevin

回答

1

获取从第三 “时间” 元素的值在XML:

xDoc.Root.Element("forecast") 
     .Elements("time") 
     .Skip(2).First() 
     .Element("temperature") 
     .Attribute("day") 
     .Value; 

或者如果你喜欢的日期进行搜索(更可靠):

xDoc.Root.Element("forecast") 
     .Elements("time") 
     .Single(x => x.Attribute("day").Value == "2013-12-25") 
     .Element("temperature") 
     .Attribute("day") 
     .Value; 

如果th ere有任何机会可以搜索文件中多次存在的日期,如果有多条记录,则需要First,因为Single会爆炸。

如果有搜索不会在你的XML存在于一切,看看SingleOrDefaultFirstOrDefault日期的任何机会,因为这些返回null如果记录不存在,而不是抛出异常。如果是这种情况,则需要将上述查询分为两部分,在尝试获取当天的温度之前测试null。

1

使用您的XML示例,这是你可以做的只获得第三个元素。

IEnumerable<XElement> times = (
      from item in xDoc.Root.Element("forecast").Elements("time") 
       select item).Skip(2).Take(1); 

foreach (XElement el in times) 
    Console.WriteLine(el); 

希望这有助于

相关问题