2009-07-18 4 views
1

Je suis en train d'analyser un fichier XML envoyé crypté et posté envoyé à mon site à partir d'un autre serveur.Comment biphaser foreach dans une analyse XML avec PHP si le champ n'existe pas?

Actuellement, le XML (déchiffré) ressemble sorta comme ceci:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?> 
<transactions> 
<transaction> 
    <id>407145</id> 
    <store_id>4067</store_id> 
    <custom_fields> 
     <custom_field> 
      <custom_field_name>affiliateID</custom_field_name> 
      <custom_field_value>25</custom_field_value> 
     </custom_field> 
     </custom_fields> 
</transaction> 
</transactions> 

Et l'analyseur ressemble à ceci:

$XMLData = rc4crypt::decrypt($key, urldecode($_POST["XMLData"])); 
$data = new XMLParser($FoxyData); // Parse that XML. 
$data->Parse(); 

// go through each of the nodes 
foreach ($data->document->transactions[0]->transaction as $tx) { 

    $id = $tx->id[0]->tagData; 
    $store_id = $tx->id[0]->tagData; 

    // get the affiliateID 
    foreach ($tx->custom_fields[0]->custom_field as $field) { 
    $affiliateID = $field->custom_field_value[0]->tagData; 
} 



} 

Les travaux ci-dessus à moins XML envoyé à notre serveur est manquant les noeuds custom_fields. Ensuite, il génère une erreur "Propriété non définie: XMLTag :: $ custom_field".

Depuis que je suis un hack, je pensais que quelque chose comme ce qui suit fonctionnerait, mais il ne compte pas:

if($tx->custom_fields[0]->custom_field) { 

    foreach ($tx->custom_fields[0]->custom_field as $field) { 
    $affiliateID = $field->custom_field_value[0]->tagData; 
} 

} 

Cela me semble logique - mais ce qui ne va pas dans ma logique? Comment puis-je dire à mon script de ne pas faire le foreach si ce noeud n'existe pas dans le xml?

Répondre

1

Je pense que isset() est probablement ce que vous cherchez:

if (isset($tx->custom_fields[0]->custom_field)) { 
    foreach ($tx->custom_fields[0]->custom_field as $field) { 
     $affiliateID = $field->custom_field_value[0]->tagData; 
    } 
} 

Notez qu'il n'y a pas besoin de vérifier $tx->custom_fields, puis $tx->custom_fields[0], séparément, en utilisant isset() sur le niveau le plus profond sera de retour faux (comme contraire à provoquer une erreur) même si $tx->custom_fields n'existe pas.

2

Vous devez d'abord vérifier l'existence de $ tx-> custom_fields et $ tx-> custom_fields [0], puis l'utiliser plus avant.