【问题标题】:XDocument Multiple Elements with same nameXDocument 多个具有相同名称的元素
【发布时间】:2013-12-24 01:57:22
【问题描述】:

在一个 XML 文档中,我有 3 个不同的元素,都名为“时间”。如何选择此 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>

【问题讨论】:

  • 您可能会使用Elements("Time").Skip(2).First() 或类似的东西,但您确定它始终是第三个元素吗?你可能会更好地依赖于 Xml 中的相同值而不是元素的序号。
  • 我得到一个 InvalidOperationExeption。如果可能的话,它也可以按日期进行。
  • 修复了我的相对愚蠢的错误。忘记小写 Elements("time") 导致异常。工作得很好。

标签: c# xml windows-phone-8


【解决方案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;

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

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

【讨论】:

    【解决方案2】:

    使用您的 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);
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2013-06-13
      • 2019-02-15
      • 2017-07-11
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多