XDocument具有相同名称的多个元素

时间:2013-12-24 01:57:23

标签: c# xml windows-phone-8

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

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

顺便说一句,名为“Time”的XML元素通过属性“Day”附加了不同的日期,如果有任何用途的话。

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

2 个答案:

答案 0 :(得分:1)

从XML中的第三个“time”元素获取值:

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;

如果您有可能在文件中搜索多次存在的日期,那么如果有多条记录,则需要First,因为Single会爆炸。

如果有可能搜索XML中根本不存在的日期,请查看SingleOrDefaultFirstOrDefault,如果记录没有,则返回null存在而不是抛出异常。如果是这种情况,您需要将上述查询分成两部分,在尝试获取当天的温度之前测试null。

答案 1 :(得分: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);

希望这有帮助