C# XmlDocument выберите узлы возвращает пустой
Я пытаюсь работать с http://api.met.no/weatherapi/locationforecast/1.9/?lat=49.8197202;lon=18.1673554 XML. Допустим, я хочу выбрать все значения атрибута каждого элемента температуры.
Я попробовал это.
const string url = "http://api.met.no/weatherapi/locationforecast/1.9/?lat=49.8197202;lon=18.1673554";
WebClient client = new WebClient();
string x = client.DownloadString(url);
XmlDocument xml = new XmlDocument();
xml.LoadXml(x);
XmlNodeList nodes = xml.SelectNodes("/weatherdata/product/time/location/temperature");
//XmlNodeList nodes = xml.SelectNodes("temperature");
foreach (XmlNode node in nodes)
{
Console.WriteLine(node.Attributes[0].Value);
}
Но я ничего не получаю все время. Что я делаю неправильно?
2 ответа
Текущая одиночная косая черта нацелена на погодные данные под корнем, но корень - погодные данные.
Добавьте косую черту в свой запрос xpath, чтобы сделать ее двойной косой чертой:
XmlNodeList nodes = xml.SelectNodes("//weatherdata/product/time/location/temperature");
Двойная косая черта указывает xpath выбирать узлы в документе из текущего узла, которые соответствуют выбору, независимо от того, где они находятся.
или удалите предыдущую косую черту:
XmlNodeList nodes = xml.SelectNodes("weatherdata/product/time/location/temperature");
который ищет весь путь, включая корень.
Кроме того, так как вы, очевидно, хотите, чтобы значение под названием value добавьте это:
Console.WriteLine(node.Attributes["value"].Value);
Поскольку значение at of node.Attributes[0].Value может быть не в том порядке, в котором вы ожидаете.
Вы пытаетесь перебрать каждый атрибут?
foreach (XmlNode node in nodes)
{
//You could grab just the value like below
Console.WriteLine(node.Attributes["value"].Value);
//or loop through each attribute
foreach (XmlAttribute f in node.Attributes)
{
Console.WriteLine(f.Value);
}
}