Salut,
Tu peux utiliser l'extension DOMXml de PHP4, qui fait partie du coeur de PHP (à moins que PHP ait été compilé spécifiquement sans, ce qui serait quand même vicieux).
Exemple de script pour récupérer l'adresse IP :
<?php
// Création d'un nouveau document DOM
$doc = new DOMDocument();
// On charge le XML. On pourrait utiliser la méthode loadXML() pour charger un xml depuis une chaîne de caractères
$doc -> load('http://www.ipinfodb.com/ip_query.php?ip=77.204.58.12&output=xml');
// On récupère TOUS les éléments dont le nom est Ip... C'est con quand y'en a qu'un ^^ mais y'a pas d'autre solution
$i = $doc -> getElementsByTagName('Ip');
// On ne veut que le premier (parce que là, on sait qu'il n'y en a qu'un)
$ip = $i -> item(0);
// La valeur de l'adresse IP
echo $ip -> nodeValue;
?>
Bon c'est un exemple très con, parce que l'adresse IP, on la donne au script... Mais on peut évidemment faire ça avec les autres données (Status, CountryName, City, Latitude, Longitude, etc).
Toujours avec DOMXml, on peut utiliser une boucle foreach, mais dans ce cas, sur l'élément Response :
<?php
$doc = new DOMDocument();
$doc -> load('http://www.ipinfodb.com/ip_query.php?ip=77.204.58.12&output=xml');
$response = $doc -> getElementsByTagName('Response');
foreach ($response -> childNodes as $element) {
if (is_a($element, 'DOMElement')) {
echo $element -> nodeName, ' : ', $element -> nodeValue, "\n";
}
}
?>
Pour une raison que j'ignore (n'ayant pas poussé les recherches trop loin), quand on parcours les éléments de $response, on obtient quelques DOMText dont tu n'as vraissemblablement rien à faire (ce sont des chaines de caractères blancs)... Ce qui t'intéresse, ce sont plutôt les DOMElement, d'où la vérification. L'avantage de parcourir les éléments est qu'on peut les stocker dans des variables beaucoup plus facilement qu'en allant les chercher tous un à un.
Une autre solution pourrait être d'utiliser une PCRE. Le document à parser étant relativement court et de format invariable, ce n'est pas une idée à exclure.
Exemple :
<?php
$fh = fopen('http://www.ipinfodb.com/ip_query.php?ip=77.204.58.12&output=xml', 'r');
$content = '';
while (FALSE !($row fgets($fh))) {
$content .= $row;
}
fclose($fh);
if (preg_match_all('`<([a-z]+)>([^<]*)</\1>`mi', $content, $matches)) {
foreach ($matches[1] as $k => $v) {
$$v = $matches[2][$k];
}
}
echo $City;
?>
Pour ce qui est des performances, je ne sais pas du tout quelle méthode est la plus avantageuse...
Pour ce qui est de la pertinence des informations, par contre, je te laisse seul juge... Simplement, quand j'ai essayé avec mon adresse Ip, il m'a situé dans le Rhône, alors que je suis en Creuse... A 300 km près, c'était bon...
--
Neige
Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)