PHP analyse syntaxique simpleXML
Question
J'ai besoin de conversion de devises, l'euro au dollar.
La banque centrale européenne fournit les taux ici:
http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml
Je peux obtenir le taux de USD en utilisant le premier noeud, mais s'ils changent l'ordre
Ai-je besoin de quelque chose plus fiable? Je ne sais pas comment ..
$xml = @simplexml_load_file('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml');
echo "dollar: " . $xml->Cube->Cube->Cube[0]->attributes()->rate;
La solution
Il suffit d'utiliser XPath pour obtenir un nœud avec l'attribut @currency égal à « USD », qui fera l'affaire.
$xref = simplexml_load_file('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml');
$nodes = $xref->xpath('//*[@currency="USD"]');
echo $nodes[0]['rate'];
Autres conseils
Ils fournissent un exemple de code à cette page:
Il suffit de cliquer sur l'onglet Pour les développeurs
Il y a aussi un (unmaintained) PEAR Forfait Taux de change
Vous ne devriez pas la peine si elles changent l'ordre. Si elles le font, ils le font.
Vous pouvez itérer à travers des objets SimpleXML avec un foreach
foreach( $xml->Cube->Cube as $cube ) {
if( isset( $cube->attributes()->rate ) ) {
$rate = $cube->attributes()->rate;
}
}
Vous pouvez utiliser XPath
$rate = $xml->xpath("//Cube[currency='USD']/rate")
Vous avez raison. À l'heure actuelle, vous assumez l'entrée 0th
à USD
et si les changements d'ordre dans l'avenir de votre hypothèse échoue. Donc, pour rendre votre application indépendante de l'ordre, vous pouvez vérifier l'attribut currency
dans une boucle. Le moment où vous trouvez une valeur avec "USD"
vous pouvez obtenir son attribut rate
correspondant.