我有一个问题)如何从特定节点获取价值(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)并抛出异常。
答案 0 :(得分:0)
尝试这样的事情
if (elem != null)
elem.Descendants("day_part").Where(el => el.Attribute("type").Value == "день")
.ToList().ForEach(el => listBox1.Items.Add(el.Element("temperature").Value));
答案 1 :(得分: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=\"день\"]");
答案 2 :(得分: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
属性值而不是typeid
搜索type
元素:
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);
};