-1

質問があります) 特定のノードから値を取得するにはどうすればよいですか (info/weather/day/day_part type="День" /tempreture )

<?xml version="1.0" encoding="UTF-8"?>
<info lang="ru" xmlns:x="http://www.yandex.ru/xscript">
  +<region id="213" lon="37.617671" lat="55.755768" zoom="10"/>
  <traffic lon="37.617671" lat="55.755768" zoom="10" region="213"></traffic>
  <weather region="213" climate="1">
    <source xmlns:xi="http://www.w3.org/2001/XInclude">mb3d</source>
    <day xmlns:xi="http://www.w3.org/2001/XInclude">
      <title>Москва</title>
      <country>Россия</country>
      <time_zone>Europe/Moscow</time_zone>
      <summer-time>0</summer-time>
      <sun_rise>06:51</sun_rise>
      <sunset>20:14</sunset>
      <daytime>d</daytime>+<date date="2013-04-05T00:00:00Z"/>
      <day_part type="день" typeid="2">
        <weather_type>облачно</weather_type>
        <weather_code>overcast</weather_code>
        <image>http://weather.yandex.ru/i/5.png</image>
        <image-v2 size="22x22">http://yandex.st/weather/v-1/i/icons/22x22/ovc_+6.png</image-v2>
        <image-v3 size="48x48">http://yandex.st/weather/v-1/i/icons/48x48/ovc.png</image-v3>
        <image_number>5</image_number>
        <wind_speed>5.0</wind_speed>
        <wind_direction id="se">юв</wind_direction>
        <dampness>70</dampness>
        <pressure>743</pressure>
        <temperature color="F2F0E6" class_name="t6">+5</temperature>
        <time_zone>Europe/Moscow</time_zone>
        <observation_time>17:30</observation_time>
        <observation>2013-04-05T17:30:00</observation>
      </day_part>
      <day_part type="вечер" typeid="3"></day_part>
      <day_part type="ночь" typeid="4"></day_part>
      <day_part type="утро" typeid="1"></day_part>
      <day_part type="день" typeid="2"></day_part>
      <night_short></night_short>
      <tomorrow></tomorrow>
    </day>
    <url xmlns:xi="http://www.w3.org/2001/XInclude">http://pogoda.yandex.ru/moscow/</url>
  </weather>
</info>

コードはありますが、type="День" のノードが必要であることを指定するにはどうすればよいですか

XElement elem = xDocument.Element("info");
     if (elem != null)
        foreach (var el in elem.Elements("weather").Elements("day").Elements("day_part"))
           {
             var level = el.Element("temperature").Value;
             listBox1.Items.Add(level);
           };

このコード ブロックは 2 つの値 (+5、+6) を返しますが、1 つ (+5) しか必要なく、例外をスローします。

4

3 に答える 3

0

まず第一に、入力 XML が無効であり、.xml にロードできませんXDocument。私はそれを次のように修正しました:

<?xml version="1.0" encoding="UTF-8"?>
<info lang="ru" xmlns:x="http://www.yandex.ru/xscript">+<region id="213" lon="37.617671" lat="55.755768" zoom="10" />
<traffic lon="37.617671" lat="55.755768" zoom="10" region="213"></traffic>
 <weather region="213" climate="1">
 <source xmlns:xi="http://www.w3.org/2001/XInclude">mb3d</source>
 <day xmlns:xi="http://www.w3.org/2001/XInclude">
  <title>Москва</title>
  <country>Россия</country> 
  <time_zone>Europe/Moscow</time_zone> 
  <summer-time>0</summer-time>  
  <sun_rise>06:51</sun_rise>
  <sunset>20:14</sunset>
  <daytime>d</daytime>
  <date date="2013-04-05T00:00:00Z"></date>
  <day_part type="день" typeid="2">
          <weather_type>облачно</weather_type>
          <weather_code>overcast</weather_code>
          <image>http://weather.yandex.ru/i/5.png</image>
          <image-v2 size="22x22">http://yandex.st/weather/v-1/i/icons/22x22/ovc_+6.png</image-v2>
          <image-v3 size="48x48">http://yandex.st/weather/v-1/i/icons/48x48/ovc.png</image-v3>
          <image_number>5</image_number>
          <wind_speed>5.0</wind_speed>
          <wind_direction id="se">юв</wind_direction>
          <dampness>70</dampness>
          <pressure>743</pressure>
          <temperature color="F2F0E6" class_name="t6">+5</temperature>
          <time_zone>Europe/Moscow</time_zone>
          <observation_time>17:30</observation_time>
          <observation>2013-04-05T17:30:00</observation>
  </day_part>
  <day_part type="вечер" typeid="3"></day_part>
  <day_part type="ночь" typeid="4"></day_part>
  <day_part type="утро" typeid="1"></day_part>
  <day_part type="день" typeid="2"></day_part>
  <night_short></night_short>
  <tomorrow></tomorrow>
</day>
<url xmlns:xi="http://www.w3.org/2001/XInclude">http://pogoda.yandex.ru/moscow/</url>
</weather>
</info> 

XPathSelectElementsその種の入力を使用すると、拡張メソッドを使用して目的のノード値を取得できます。

var results = xDocument.XPathSelectElements("info/weather/day/day_part[@type='день']/temperature")
                       .Select(e => (string)e)
                       .ToList();

上記の XML ドキュメントには、次の 1 つの値resultsが含まれています。string+5

ただし、代わりに属性値day_partを使用して要素を検索することをお勧めします。typeidtype

var results = xDocument.XPathSelectElements("info/weather/day/day_part[@typeid=2]/temperature")
                        .Select(e => (string)e)
                        .ToList();

結果は同じですが、エンコーディングが原因で失敗する可能性は低くなります。

次に、以下を入力できますListBox

foreach (var value in results))
{
    listBox1.Items.Add(value);
};
于 2013-04-05T15:03:33.683 に答える