-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);
           };

这段代码返回两个值(+5,+6),但我只需要一个(+5)并抛出异常。

4

3 回答 3

0

尝试这样的事情

 if (elem != null)
            elem.Descendants("day_part").Where(el => el.Attribute("type").Value == "день")
                .ToList().ForEach(el => listBox1.Items.Add(el.Element("temperature").Value));
于 2013-04-05T14:53:46.950 回答
0

您可以为 Xlinq 使用 XPath 扩展:

using System.Xml.Linq;
using System.Xml.XPath;
...
var doc = XDocument.Load("test.xml");
IEnumerable<XElement> dayElements = doc.XPathSelectElements("/info/weather/day/day_part[@type=\"день\"]");
于 2013-04-05T15:01:37.993 回答
0

首先 - 您的输入 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 文档,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 回答