[XML] Traiter un retour XML en provenance d'une API
Bonjour à tous,
Je viens de m'inscrire sous un nouveau compte (ne trouvant plus mon ancien identifiant) afin de solliciter votre aide dans le traitement d'un retour XML.
On transmet à un laboratoire des ordonnances pour des analyses sanguines.
Celui-ci nous nous répond un OK avec un numéro d'ordre qui nous permettra par le suite de suivre la disponibilité des résultats.
Ils ont changés subitement le système, et maintenant il faut envoyer les numéros d'ordres séparés par des virgules (pas de soucis), mais c'est le retour de l'API que je n'arrive pas à traiter, voici le retour:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?xml version="1.0" encoding="utf-8"?>
<api>
<response>
<trID>API-2ddb60b10052012070311</trID>
<result code="200">
<msg>command completed successfully</msg>
</result>
</response>
<resData>
<medialog_chkResult>
<name available="1">2012050901789</name>
<name available="0">2012050901761</name>
<name available="0">2012050901506</name>
</medialog_chkResult>
</resData>
</api> |
La réponse est stockée dans ma variable $apiResponse et voici comment je "traduis" celle-ci.
Code:
1 2 3 4
| $xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startTag", "endTag");
xml_set_character_data_handler($xml_parser, "contents");
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, FALSE); |
Le résultat qui en ressort est mauvais:
Array
(
[trID] => API-2ddb60b10052012070311
[code] => 200
[msg] => command completed successfully
[available] => 0
[name] => 2012050901789;2012050901761;2012050901506
)
Pour les disponibilités des examens, 1 était disponible (available="1") et 2 non disponibles (available="0") or dans mon Array, je n'ai plus que [available] => 0.
De même que pour les numéros d'ordres, ils sont tous fusionnés ...
Je ne parviens pas à trouver comment faire pour avoir ce résultat:
Code:
1 2 3 4 5 6
| [available] => 1
[name] => 2012050901789
[available] => 0
[name] => 2012050901761
[available] => 0
[name] => 2012050901506 |
Car il me faut ensuite pouvoir les "isoler" afin d'associer le bon numéro d'ordre au bon résultat de disponibilité.
Quand je pouvais n'en envoyer qu'un seul, je faisais mon interprétation ainsi:
Code:
1 2 3 4 5
| if ( $nodes["available"] == "0" ) {
//Ma commande de MAJ en BDD (résultats dispo)
} else {
//Ma commande de MAJ en BDD (résultats non dispo)
} |
Merci à tous pour vos conseils,
Damien
Voici mes fonctions qui sont appelées dans mes commandes PHP.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| $current_tag="";
$nodes = array();
function contents($parser, $name){
global $current_tag, $nodes;
$cur_name = ltrim(str_replace("\n", "", $name));
if ( $cur_name != '') {
if ( !isset($nodes[$current_tag]) ) {
$nodes[$current_tag] = $cur_name;
}
else {
$nodes[$current_tag] .= ";" . $cur_name;
}
}
}
function startTag($parser, $name, $attrs){
global $current_tag, $nodes;
$current_tag = $name;
while (list($k, $v) = each($attrs)) {
$nodes[$k] = $v;
}
}
function endTag($parser, $name){
} |