Parser un flux xml provenant d'une url

cs_christobal Messages postés 208 Date d'inscription jeudi 3 octobre 2002 Statut Membre Dernière intervention 31 mars 2011 - 5 janv. 2010 à 13:53
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 - 5 janv. 2010 à 23:57
bonjour,
j'utilise le service de www.ipinfodb.com pour me retourner en xml certain infos du visiteur : http://www.ipinfodb.com/ip_query.php?ip=votre_adresse_ip&output=xml
le script php que propose ce site est en php5 et moi j'ai du php4.
comme faire pour récupérer les infos et le mettre dans des variables ?

merci.
A voir également:

2 réponses

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
5 janv. 2010 à 20:40
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à ;)
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
5 janv. 2010 à 23:57
Je viens de comprendre pourquoi il rajoute des lignes vides quand on parcours les éléments. Pour éviter cela, il faut préciser :
$doc -> preserveWhiteSpace = FALSE;

Et puis j'ai fait un petit oubli, voici donc le deuxième script corrigé et complété :
<?php
$doc = new DOMDocument();
$doc -> preserveWhiteSpace = FALSE;
$doc -> load('http://www.ipinfodb.com/ip_query.php?ip=77.204.58.12&output=xml');
$response = $doc -> getElementsByTagName('Response');
$response = $response -> item(0);
foreach ($response -> childNodes as $element) {
echo $element -> nodeName, ' : ', $element -> nodeValue, "\n";
}
?>


--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
Rejoignez-nous