2016-12-15 3 views
0

J'essaie de travailler avec http://api.met.no/weatherapi/locationforecast/1.9/?lat=49.8197202;lon=18.1673554 XML. Disons que je veux sélectionner tous les attributs de valeur de chaque élément de température.C# XmlDocument sélectionner les noeuds retourne vide

J'ai essayé ceci.

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

Mais je n'obtiens rien tout le temps. Qu'est-ce que je fais mal?

+0

donc probablement cette note n'existe pas dans votre document. Utilisez également XDocument – mybirthname

+0

Il existe. Je dois utiliser la classe XmlDocument. Je dois le faire pour le projet d'école et c'est un spécifié. – gygabyte

Répondre

0

La barre oblique unique actuelle cible les données météorologiques sous la racine mais la racine est les données météorologiques.

Ajouter une barre oblique précédente à votre requête XPath pour en faire une double barre oblique:

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

barre oblique double indique XPath pour sélectionner des noeuds dans le document à partir du nœud actuel qui correspondent à la sélection, peu importe où ils sont.

ou supprimer la barre oblique précédent:

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

qui recherche le chemin complet y compris la racine.

En outre, puisque vous voulez apparemment la valeur appelée à valeur ajoutée ceci:

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

Puisque la valeur à des node.Attributes [0] .Value ne peut pas être dans l'ordre que vous attendez.

0

Essayez-vous de parcourir chaque attribut?

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

Nulle part je suppose. Dois-je? – gygabyte

+0

édité. Vu que tu as édité ta question –