2016-12-15 8 views
0

Я пытаюсь работать с http://api.met.no/weatherapi/locationforecast/1.9/?lat=49.8197202;lon=18.1673554 XML. Допустим, я хочу выбрать все атрибуты значений для каждого элемента температуры.C# XmlDocument select nodes возвращает пустые

Я попробовал это.

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

Но я ничего не получаю все время. Что я делаю не так?

+0

поэтому, вероятно, эта заметка не существует в вашем документе. Также используйте XDocument – mybirthname

+0

Он существует. Я должен использовать класс XmlDocument. Я должен сделать это для школьного проекта, и его необходимо указать. – gygabyte

ответ

0

Текущая единственная косая черта нацелена на weatherdata под корнем, но корень - weatherdata.

Добавить предшествующую черту к XPATH запроса, чтобы сделать его двойной слэш:

XmlNodeList nodes = xml.SelectNodes("//weatherdata/product/time/location/temperature"); 

Двойной слэш говорит XPath, чтобы выбрать узлы документа из текущего узла, который соответствует выбору, независимо от того, где они находятся.

или удалить предыдущую слэш:

XmlNodeList nodes = xml.SelectNodes("weatherdata/product/time/location/temperature"); 

который смотрит на весь путь, включая корень.

Кроме того, так как вы, очевидно, хотите значение, называемое значение добавьте это:

Console.WriteLine(node.Attributes["value"].Value); 

Поскольку значение при node.Attributes из [0] .Value может не быть в порядке, вы ожидаете.

0

Вы пытаетесь пройти через каждый атрибут?

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

Нигде я не думаю. Должен ли я? – gygabyte

+0

отредактировал. Видел, что вы отредактировали свой вопрос –