La consommation d'un REPOS de service web XML
Je suis en train de consommer le service web suivant http://ipinfodb.com/ip_location_api.php
ce service web renvoie une réponse xml, le code ci-dessous obtient la réponse XML, mais de toute façon lors de la suppression progressive des valeurs de la réponse XML, il ne fonctionne pas.
Quel est le problème avec mon code?
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.IO;
using System.Net;
using System.Xml;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
HttpWebRequest request = null;
HttpWebResponse response = null;
String Xml;
//Create the web request
request = WebRequest.Create("http://api.ipinfodb.com/v2/ip_query.php?key=<yourkey>&ip=74.125.45.100&timezone=true") as HttpWebRequest;
//Get response
using (response = request.GetResponse() as HttpWebResponse)
{
//Get the response stream
StreamReader reader = new StreamReader(response.GetResponseStream());
Xml = reader.ReadToEnd();
}
//Console xml output
Console.WriteLine(Xml); //see if we get the xml response, (YES we do)
Console.ReadLine();
string _currentField = "";
StringReader _sr = new StringReader(Xml);
XmlTextReader _xtr = new XmlTextReader(_sr);
_xtr.XmlResolver = null;
_xtr.WhitespaceHandling = WhitespaceHandling.None;
//get the root node
_xtr.Read();
if ((_xtr.NodeType == XmlNodeType.Element) && (_xtr.Name == "Response"))
{
while (_xtr.Read())
{
if ((_xtr.NodeType == XmlNodeType.Element) && (!_xtr.IsEmptyElement))
{
_currentField = _xtr.Name;
_xtr.Read();
if (_xtr.NodeType == XmlNodeType.Text)
{
switch (_currentField)
{
case "Status":
Console.WriteLine(_xtr.Value); //we print to console for testing purposes, normally assign it to a variable here!
break;
case "CountryCode":
Console.WriteLine(_xtr.Value);
break;
case "CountryName":
Console.WriteLine(_xtr.Value);
break;
case "RegionCode":
Console.WriteLine(_xtr.Value);
break;
case "RegionName":
Console.WriteLine(_xtr.Value);
break;
case "City":
Console.WriteLine(_xtr.Value);
break;
case "ZipPostalCode":
Console.WriteLine(_xtr.Value);
break;
case "Latitude":
Console.WriteLine(_xtr.Value);
break;
case "Longitude":
Console.WriteLine(_xtr.Value);
break;
case "Gmtoffset":
Console.WriteLine(_xtr.Value);
break;
case "Dstoffset":
Console.WriteLine(_xtr.Value);
break;
case "TimezoneName":
Console.WriteLine(_xtr.Value);
break;
case "Isdst":
Console.WriteLine(_xtr.Value);
break;
case "Ip":
Console.WriteLine(_xtr.Value);
break;
default:
//unknown field
throw new Exception("Unknown field in response.");
}
}
}
}
}
Console.ReadLine();
}
}
}
EDIT: c'est de la réponse XML retourné
<?xml version="1.0" encoding="UTF-8" ?>
- <Response>
<Status>OK</Status>
<CountryCode>US</CountryCode>
<CountryName>United States</CountryName>
<RegionCode>06</RegionCode>
<RegionName>California</RegionName>
<City>Mountain View</City>
<ZipPostalCode>94043</ZipPostalCode>
<Latitude>37.4192</Latitude>
<Longitude>-122.057</Longitude>
<Gmtoffset>-28800</Gmtoffset>
<Dstoffset>0</Dstoffset>
<TimezoneName>America/Los_Angeles</TimezoneName>
<Isdst>0</Isdst>
<Ip>74.125.45.100</Ip>
</Response>
OriginalL'auteur 001 | 2011-01-14
Vous devez vous connecter pour publier un commentaire.
Je utiliser cette même API, je charge le fichier XML de réponse dans un XDocument et d'analyser par exemple
Ce que vous devez faire est de présenter une classe personnalisée par exemple
GeoLocationInfo
et enveloppez votre code dans une fonction, par exemple,GetGeoLocation(string ip)
alors au lieu d'écrire des informations dans la fenêtre de la console, vous pouvez remplir & retourner une instance de cette classe.OriginalL'auteur
Ma solution serait:
exécuter le
xsd.exe
utilitaire sur votre résultat XML deux fois pour le convertir en un fichier XSD (première étape) et une classe C# (deuxième étape) - ce serait vous donner une classe C#Response
ensuite, vous pouvez facilement désérialiser de la réponse dans une instance de cette classe:
et maintenant votre
result
devrait contenir une instance deResponse
, avec tous les éléments que belle des champs dans votre objet.Lire plus sur xsd.exe sur son MSDN page de doc.
OriginalL'auteur
Vous êtes en supposant que le premier nœud est le nœud racine, mais ce n'est pas correct. Vous aurez
XmlDeclaration
nœud en premier et qui en peuvent être suivies parWhitespace
nœuds. Donc, vous devriez probablement de la structure de votre code quelque chose commeMais dit, personnellement, je ne préfère créer une réponse XSD (mieux si de service web fournit) et de générer les classes (à l'aide d'XSD.exe ou Xsd2Code) pour sérialiser/deserialise.
OriginalL'auteur
Je pense que vous devez utiliser _xtr.MoveToContent(); la Méthode avant d'utiliser la méthode de lecture..
Voir si cela fonctionne
OriginalL'auteur