Parser un flux xml provenant d'une url

Signaler
Messages postés
208
Date d'inscription
jeudi 3 octobre 2002
Statut
Membre
Dernière intervention
31 mars 2011
-
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
-
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

Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
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à ;)
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
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à ;)