Page 1 sur 1

Accès à élément parsage fichier XML

Posté : 21 févr. 2017, 11:51
par Jenjak77
Bonjour à tous,

Je suis actuellement sur le parsage d'un fichier XML mais je ne parviens pas à récupérer certains éléments (en fait si j'arrive à les récupérer mais pas de la bonne manière et vu que certains ont le même nom tout s'affiche alors que je veux maitriser chaque éléments)

La partie qui me pose soucis est l'accès à Pmtid -> EndToEndId par exemple (ou InstdAmt, ou le Id de Id->OrgId ->Othr)

Voici mon code:
<?php
$FichierXML = file_get_contents('fichier_test.xml');
$resultats= new simpleXMLElement($FichierXML);
foreach($resultats->CstmrCdtTrfInitn->PmtInf->CdtTrfTxInf[0] as $valeur) {
echo "".$valeur->PmtId->EndToEndId."<br />";
}
?>
J'ai essayé aussi avec $valeur->PmtId['EndToEndId'] mais rien à faire... Je ne pense pas avoir compris la logique :)

Voici une partie du fichier XML avec var_dump:
SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [xmlnsxsi] => http//www.w3.org/2001/XMLSchema-instance
        )

    [CstmrCdtTrfInitn] => SimpleXMLElement Object
        (
            [GrpHdr] => SimpleXMLElement Object
                (
                    [MsgId] => texte
                    [CreDtTm] => texte
                    [NbOfTxs] => texte
                    [CtrlSum] => texte
                    [InitgPty] => SimpleXMLElement Object
                        (
                            [Nm] => texte
                        )

                )

            [PmtInf] => SimpleXMLElement Object
                (
                    [PmtInfId] => texte
                    [PmtMtd] => TRM
                    [PmtTpInf] => SimpleXMLElement Object
                        (
                            [SvcLvl] => SimpleXMLElement Object
                                (
                                    [Cd] => texte
                                )

                        )

                    [ReqdExctnDt] => 2016-09-23
                    [Dbtr] => SimpleXMLElement Object
                        (
                            [Nm] => texte
                        )

                    [DbtrAcct] => SimpleXMLElement Object
                        (
                            [Id] => SimpleXMLElement Object
                                (
                                    [IOd] => texte
                                )

                        )

                    [DbtrAgt] => SimpleXMLElement Object
                        (
                            [FinInstnId] => SimpleXMLElement Object
                                (
                                    [Pmd] => texte
                                )

                        )

                    [ChrgBr] => SLC
                    [CdtTrfTxInf] => Array
                        (
                            [0] => SimpleXMLElement Object
                                (
                                    [PmtId] => SimpleXMLElement Object
                                        (
                                            [EndToEndId] => texte
                                        )

                                    [Amt] => SimpleXMLElement Object
                                        (
                                            [InstdAmt] => texte
                                        )

                                    [UltmtDbtr] => SimpleXMLElement Object
                                        (
                                            [Nm] => texte
                                            [Id] => SimpleXMLElement Object
                                                (
                                                    [OrgId] => SimpleXMLElement Object
                                                        (
                                                            [Othr] => SimpleXMLElement Object
                                                                (
                                                                    [Id] => texte
                                                                )

                                                        )

                                                )

                                        )

                                    [CdtrAgt] => SimpleXMLElement Object
                                        (
                                            [FinInstnId] => SimpleXMLElement Object
                                                (
                                                    [Pmd] => texte
                                                )

                                        )

                                    [Cdtr] => SimpleXMLElement Object
                                        (
                                            [Nm] => texte
                                        )

                                    [CdtrAcct] => SimpleXMLElement Object
                                        (
                                            [Id] => SimpleXMLElement Object
                                                (
                                                    [tsj] => texte
                                                )

                                        )

                                    [RmtInf] => SimpleXMLElement Object
                                        (
                                            [Ustrd] => texte
                                        )

                                )
Merci d'avance pour votre aide !

Re: Accès à élément parsage fichier XML

Posté : 21 févr. 2017, 15:00
par moogli
salut,

attantion $resultats->CstmrCdtTrfInitn->PmtInf->CdtTrfTxInf[0] c'est un objet et pas un tableau tu coup tu itères sur les propriétés de l'objet donc fatalement tu n'auras pas ce que tu souhaites.
pour faire ce que tu veux
<?php
$FichierXML = file_get_contents('fichier_test.xml');
$resultats= new simpleXMLElement($FichierXML);
foreach($resultats->CstmrCdtTrfInitn->PmtInf->CdtTrfTxInf as $valeur) {
    echo $valeur->PmtId->EndToEndId.'<br />'; // inutile la chaîne vide au départ ;)
}
@+

Re: Accès à élément parsage fichier XML

Posté : 21 févr. 2017, 16:37
par Jenjak77
Salut Moogli, c'est parfait, effectivement je me suis basé sur un ancien script que j'avais fait mais la structure était différente, du coup j'ai un peu bloqué pour rien... :)

Pour faire écho à mon autre sujet de l'autre jour, j'ai pu rentrer tous mes enregistrements dans ma base de données (pour faire le test), comme tu me l'avais conseillé il faut maintenant que je fasse un SELECT COUNT afin de voir si l'enregistrement n'existe pas déjà, si c'est 0 je lance la requête d'enregistrement (celle qui fonctionne) et si 1 = rien du tout.

J'ai fais ma requête pour vérifier par contre ça me ressort un Erreur : SQLSTATE[08004] [1040] Too many connections, comme ça l'indique apparemment il n'aime pas les 207 requêtes en simultanés mais je ne vois pas trop à quel endroit la placer pour optimiser, voici le code:
<?php
$FichierXML = file_get_contents('fichier1.xml');
$resultats= new simpleXMLElement($FichierXML);
    
if (isset($_POST['envoyer'])) {   

echo "
<div class='ligne_bis'>
    <div class='bloc1_bis'>EndtoEndId</div>
    <div class='bloc2_bis'>InstdAmt</div>
    <div class='bloc3_bis'>Nm1</div>
    <div class='bloc4_bis'>Id</div>
    <div class='bloc5_bis'>BIC</div>
    <div class='bloc6_bis'>Nm2</div>
    <div class='bloc7_bis'>IBAN</div>
    <div class='bloc8_bis'>Ustrd</div>
</div>
<div class='clear'></div>
";  
      
    echo "<div class='ligne'>";
    
$j = 0;
 
    foreach($resultats->CstmrCdtTrfInitn->PmtInf->CdtTrfTxInf as $valeur) {
        
        $j++;

        $EndtoEndId = $valeur->PmtId->EndToEndId;
        $InstdAmt = $valeur->Amt->InstdAmt;
        $Nm1 = $valeur->UltmtDbtr->Nm;
        $Id1 = $valeur->UltmtDbtr->Id->OrgId->Othr->Id;
        $BIC = $valeur->CdtrAgt->FinInstnId->BIC;
        $Nm2 = $valeur->Cdtr->Nm;
        $IBAN = $valeur->CdtrAcct->Id->IBAN;
        $Ustrd = $valeur->RmtInf->Ustrd;
        
        try {
            $bdd = new PDO('mysql:host=localhost;dbname=ze_xml;charset=utf8', 'root', '');
        }
        catch(Exception $e) {
            die('Erreur : '.$e->getMessage());
        }
        
        $verification = $bdd->query("select count(1) from enregistrements where EndtoEndId=$EndtoEndId AND IBAN=$IBAN AND Ustrd=$Ustrd");
        
        // $enregistrement = $bdd->query("INSERT INTO enregistrements (EndtoEndId, InstdAmt, Nm1, Id1, BIC, Nm2, IBAN, Ustrd) VALUES ('$EndtoEndId', '$InstdAmt', '$Nm1', '$Id1', '$BIC', '$Nm2', '$IBAN', '$Ustrd')");

        // echo "<div class='bloc1'>$EndtoEndId</div>";
        // echo "<div class='bloc2'>$InstdAmt</div>";
        // echo "<div class='bloc3'>$Nm1</div>";
        // echo "<div class='bloc4'>$Id1</div>";
        // echo "<div class='bloc5'>$BIC</div>";
        // echo "<div class='bloc6'>$Nm2</div>";
        // echo "<div class='bloc7'>$IBAN</div>";
        // echo "<div class='bloc8'>$Ustrd</div>";

    }

    $verification->closeCursor(); 

    echo "</div>";
    echo "<div class='clear'></div><br /><br /><center><b>$j</b> ENREGISTREMENTS</center><br /><br />";
    
} else {
    echo "
    <br /><br /><br /><br /><center>
    <form action='' method='post' enctype='multipart/form-data'>
    <input type='submit' name='envoyer' value='Envoyer'>
    </form>
    </center>
    ";
}
?>

Re: Accès à élément parsage fichier XML

Posté : 21 févr. 2017, 16:53
par moogli
il faut que :
- tu ne fasse qu'une seul connexion à la base de données => le new PDO en dehors du foreach
- tu utilises les requêtes préparées (pour l'insertion et le select).

en gros un truc comme ça
<?php
$FichierXML = file_get_contents('fichier1.xml');
$resultats= new simpleXMLElement($FichierXML);

if (isset($_POST['envoyer'])) {
  try {
      $bdd = new PDO('mysql:host=localhost;dbname=ze_xml;charset=utf8', 'root', '');
  }
  catch(Exception $e) {
      die('Erreur : '.$e->getMessage());
  }
$stmtSelect = $bdd->prepare('select count(1) as nb from enregistrements where EndtoEndId=:end AND IBAN= :iban AND Ustrd=:user');
$stmtInsert = $bdd->prepare('INSERT INTO enregistrements (EndtoEndId, InstdAmt, Nm1, Id1, BIC, Nm2, IBAN, Ustrd) VALUES (:EndtoEndId, :InstdAmt, :Nm1, :Id1, :BIC, :Nm2, :IBAN, :Ustrd');
echo "
<div class='ligne_bis'>
    <div class='bloc1_bis'>EndtoEndId</div>
    <div class='bloc2_bis'>InstdAmt</div>
    <div class='bloc3_bis'>Nm1</div>
    <div class='bloc4_bis'>Id</div>
    <div class='bloc5_bis'>BIC</div>
    <div class='bloc6_bis'>Nm2</div>
    <div class='bloc7_bis'>IBAN</div>
    <div class='bloc8_bis'>Ustrd</div>
</div>
<div class='clear'></div>
";
    $j = 0;
    echo "<div class='ligne'>";
    foreach($resultats->CstmrCdtTrfInitn->PmtInf->CdtTrfTxInf as $valeur) {

        

        $EndtoEndId = $valeur->PmtId->EndToEndId;
        $InstdAmt = $valeur->Amt->InstdAmt;
        $Nm1 = $valeur->UltmtDbtr->Nm;
        $Id1 = $valeur->UltmtDbtr->Id->OrgId->Othr->Id;
        $BIC = $valeur->CdtrAgt->FinInstnId->BIC;
        $Nm2 = $valeur->Cdtr->Nm;
        $IBAN = $valeur->CdtrAcct->Id->IBAN;
        $Ustrd = $valeur->RmtInf->Ustrd;

        $stmtSelect->execute([':end' => $EndtoEndId,':iban' => $IBAN, ':user' => $Ustrd]);
        $data = $stmtSelect->fetch(PDO::FETCH_ASSOC);
        if($data !== false && $data['nb']=== 0){
          try {
            $stmtInsert->execute([':EndtoEndId' => $EndtoEndId, ':InstdAmt' => $InstdAmt, ':Nm1' => $Nm1, ':Id1' => $Id1, ':BIC' => $BIC, ':Nm2' => $Nm2, ':IBAN' => $IBAN, ':Ustrd' => $Ustrd]);
            $j++;
          }catch(PDOException $e){
            // a voir pour gére l'erreur mais elle ne doit pas être bloquante
          }
        }
        $stmtSelect->closeCursor();
    }

    echo '</div>';
    echo '<div class="clear"></div><br /><br /><center><b>', count($resultats->CstmrCdtTrfInitn->PmtInf->CdtTrfTxInf) ,'</b> ENREGISTREMENTS</center><br /><br />';
    echo '<div class="clear"></div><br /><br /><center><b>', $j ,'</b> ligne(s) insérée(s)</center><br /><br />';
} else {
    echo "
    <br /><br /><br /><br /><center>
    <form action='' method='post' enctype='multipart/form-data'>
    <input type='submit' name='envoyer' value='Envoyer'>
    </form>
    </center>
    ";
}
@+

Re: Accès à élément parsage fichier XML

Posté : 21 févr. 2017, 17:00
par Jenjak77
D'accord ! J'ai aussi modifié le paramètres max connections dans phpmyadmin, mais effectivement c'est mon code qui n'est pas opti, merci Moogli, je reviens donner des nouvelles, bonne fin d'après-midi

Re: Accès à élément parsage fichier XML

Posté : 24 févr. 2017, 11:04
par Jenjak77
Salut Moogli, tout fonctionne parfaitement bien, encore merci pour ton aide ! (merci aussi pour l'autre sujet que j'ai créé)

Re: Accès à élément parsage fichier XML

Posté : 24 févr. 2017, 11:45
par moogli
de rien,

pense a cliquer sur le bouton résolus en haut à gauche du titre lorsque c'est le cas ;)
(aller je le fait pour toi cette fois ;) )

@+