这个问题一定很容易,但我遇到了一个问题,我无法解决这个问题:
我以这种方式下载带有天气信息的xml文件,请随时使用以下链接进行检查:
new WebClient().DownloadFile("http://export.yandex.ru/weather-ng/forecasts/72503.xml", directoryName);
var xml_file = XDocument.Load(directoryName);
我需要从.xml
文件中获取一些数字:
string str_tweet = "Weather in New York: ";
foreach (XElement el in xml_file.Root.Elements())
{
if (el.Name == "fact")
{
MessageBox.Show("DID U FIND?");
str_tweet += "temperature " + (string)el.Element("temperature");
str_tweet += ", humidity " + (string)el.Element("humidity");
str_tweet += ", pressure " + (string)el.Element("pressure") +"torr";
str_tweet += ", wind power " + (string)el.Element("wind_speed") +".";
}
}
所以问题是str_tweet
保持不变,并且MessageBox
没有显示。所以实际上他没有找到任何fact
根。我做错了什么?
简化的.xml
文件看起来像这样:
<forecast ...>
<fact>
<observation_time>2014-07-06T03:51:00</observation_time>
<uptime>2014-07-06T04:36:15</uptime>
<temperature plate="fff28e" color="F7F3D3">18</temperature>
<wind_direction>calm</wind_direction>
.......
<fact>
......
</forecast>
答案 0 :(得分:1)
如果你的预测元素有一个命名空间,那么所有它的子节点也都有这个命名空间。在这种情况下XElement.Name
属性将返回 namespace + element name,所以它不匹配fact
。您可以将条件更改为:
if (el.Name.LocalName == "fact")
或者,您可以指定命名空间并直接获取元素:
XNamespace ns = "http://weather.yandex.ru/forecast";
foreach (XElement el in xml_file.Root.Elements(ns + "fact"))
{
MessageBox.Show("DID U FIND?");
str_tweet += "temperature " + (string)el.Element(ns + "temperature");
str_tweet += ", humidity " + (string)el.Element(ns + "humidity");
str_tweet += ", pressure " + (string)el.Element(ns + "pressure") +"torr";
str_tweet += ", wind power " + (string)el.Element(ns + "wind_speed") +".";
}
有关Xml命名空间的详细信息,请查看:Working with XML Namespaces