IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[DOM] Lecture d'un fichier xml


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    410
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 410
    Points : 90
    Points
    90
    Par défaut [DOM] Lecture d'un fichier xml
    Voici ci-dessous le code xml qui me pose des soucis.
    Je parviens bien à remonter les éléments contenus dans "product" mais je bloque totalement sur la balise properties, je dois récupérer certaines valeurs inclus dans property, par exemple il me faut remonter la valeur de la property "validToDate"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    <?xml version="1.0" encoding="UTF-8"?>
     
    -<products>
     
    -<product ID="991593">
     
    <name>Réduction de 5% sur tous les hôtel à Paris</name>
     
    <price currency="EUR">0.00</price>
     
    <URL></URL>
     
     
    -<images>
     
    <image></image>
     
    </images>
     
     
    -<description>
     
    -<![CDATA[5% de réduction sur tous les hôtel à Paris]]>
    </description>
     
     
    -<categories>
     
    <category path="Voyages et vacances">Voyages et vacances</category>
     
    </categories>
     
     
    -<properties>
     
     
    -<property name="creationDate">
     
    <value>2016-10-12 12:34:18</value>
     
    </property>
     
     
    -<property name="campaignName">
     
    <value>Exemple.com</value>
     
    </property>
     
     
    -<property name="validFromDate">
     
    <value>2016-10-12</value>
     
    </property>
     
     
    -<property name="validToDate">
     
    <value>2017-09-30</value>
     
    </property>
     
     
    -<property name="discountFixed">
     
    <value>0.00</value>
     
    </property>
     
     
    -<property name="discountVariable">
     
    <value>5.00</value>
     
    </property>
     
     
    -<property name="conditions">
     
    <value>Les bons de réduction ne sont pas valables pour les promotions "Réserve immédiatement et paie à l’hôtel". Donc pour pouvoir les utiliser, vous devez choisir un hôtel qui n’adhère pas à cette convention.</value>
     
    </property>
     
     
    -<property name="voucherCode">
     
    <value>JAimeParis</value>
     
    </property>
     
    </properties>
     
    <variations/>
     
    </product>
    Voici mon code PHP actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    $document_xml = new DomDocument(); // Instanciation de la classe DomDocument : création d'un nouvel objet
    $document_xml->load('http://exemple.net/?aid=270461&encoding=utf-8&type=xml-v2&fid=-6&filter_html=1&categoryType=2&additionalType=2'); // Chargement du xml
    $elements = $document_xml->getElementsByTagName('product');
    foreach($elements as $codep)
    {
    $idcamp=$codep->getAttribute("ID");
    $idoffer=0;
    $query="select * from offers where id_plateforme=10 and id_interne=".$idcamp;
    $result = mysql_query($query, $connection) or die($query);
    $affected_rows=mysql_num_rows($result);
    if ($affected_rows==1) {
    	$data=mysql_fetch_array($result);
    	$idoffer=$data['id'];
    }
    $sdescription=$codep->getElementsByTagName("description");
    $description=$sdescription->item(0)->nodeValue;
    //mon souci commence là :(
    $properties = $document_xml->getElementsByTagName('properties');
     
    $codes = $codep->getElementsByTagName("voucherCode");
    $code = $codes->item(0)->nodeValue;
    $sdatedebut=$codep->getElementsByTagName("validFromDate");
    $datedebut=substr($sdatedebut->item(0)->nodeValue,0,19);
    $sdatefin=$codep->getElementsByTagName("validToDate");
    $datefin=substr($sdatefin->item(0)->nodeValue,0,19);
    }
    Si quelqu'un voit comment gérer celà sachant que j'utilise en PHP DomDocument
    Merci par avance

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Attention: les voucherCode, validToDate etc ne sont pas des noms d'élement, ils sont des valeurs de l'attribute name de l'élément property... on ne peut pas faire appeler la méthode getElementsByTagName() pour les trouver comme vous avez écrit , évidemment. Une façon de faire est de continuer à utilser la méthode getElementsByTagName('property') dans le neoud de contexte codep, c'est-à-dire codep->getElementsByTagName('property'), et puis faire un contrôle de leur attribut name (exactement comme vous faire de l'ID mais sur les éléments property) pour décider quelle balise property on y trouve et faire sortir le contenu textuel de sa balise enfant value pour chaque variable correspondante, $code, $validToDate etc... Vous vous êtes assez bien positionné pour en occuper le détail.

    Je peux proposer par ailleurs un chemin parfois plus efficace, au moins conceptuellement, en utilisant la téchnologie de xpath. Je peux étaler le gros plan.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //etc etc
    $elements = $document_xml->getElementsByTagName('product');
    foreach($elements as $codep) {
        $idcamp=$codep->getAttribute("ID");
        //etc etc sql etc etc
     
        $codepdoc=new DOMDocument();
        $cloned=$codep->cloneNode(true);
        $codepdoc->appendChild($codepdoc->importNode($cloned, true));	//deep=true
        $domxpath = new DOMXPath($codepdoc);
     
        //prenons d'exemple de voucherCode and validToDate seulement	
        $codeList=$domxpath->query("/product/properties/property[@name='voucherCode']/value");
        $code=($codeList->length!=0)?$codeList->item(0)->nodeValue:null;
     
        $validToDateList=$domxpath->query("/product/properties/property[@name='validToDate']/value");
        $validToDate=($validToDateList->length!=0)?$validToDateList->item(0)->nodeValue:null;
     
        //le rest  de la même façon
     
    }
    Voilà!

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    410
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 410
    Points : 90
    Points
    90
    Par défaut
    Il y a plusieurs property avec des attribute différent c'est là le souci, j'ai tenté çà mais çà ne marche pas non plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $properties = $codep->getElementsByTagName("property");
    $codes=$properties->getAttribute("voucherCode");
    J'ai l'erreur suivante : Fatal error: Call to undefined method DOMNodeList::getAttribute()
    Je préfère garder la façon de coder que j'ai actuellement donc ton bout de code ne va pas trop m'aider je préfère ne pas utiliser des trucs que je maitrise pas du tout et garder la façon de coder pour le xml sur tout mon site. J'ai même tenté avec une boucle foreach en sélectionnant properties mais tout est vide j'ai pas de résultat

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $propertyList=$codep->getElementsByTagName('property');
    foreach ($propertyList as $p) {
        $name=$p->getAttribute('name');
        $valueList=$p->getElementsByTagName('value');
        switch($name) { 
            case 'voucherCode':
                $code=($valueList->length!=0)?$valueList->item(0)->nodeValue:null;
                break;
            case 'validToDate':
                $validToDate=($valueList->length!=0)?$valueList->item(0)->nodeValue:null;
                break;
            //etc etc
            default: break;
        }
        //etc etc
    }

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    410
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 410
    Points : 90
    Points
    90
    Par défaut
    çà fonctionne parfaitement merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DOM] Probleme de lecture d'un fichier xml avec java avec l'API DOM
    Par Khalfe dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 22/01/2018, 11h24
  2. Exemple de lecture d'un fichier XML avec DOM
    Par Ioan dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 08/03/2011, 18h48
  3. [DOM XML] Message d'erreur à la lecture d'un fichier XML en PHP4
    Par Flushovsky dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 01/12/2008, 19h22
  4. [DOM] Lecture d'un fichier XML en url en PHP
    Par diakite4 dans le forum Bibliothèques et frameworks
    Réponses: 11
    Dernier message: 21/05/2008, 16h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo