Linq to XML:在.xml文件中找不到确切的根

时间:2014-07-06 10:37:29

标签: c# xml linq

这个问题一定很容易,但我遇到了一个问题,我无法解决这个问题:

我以这种方式下载带有天气信息的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>

1 个答案:

答案 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