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

Langage PHP Discussion :

lire un fichier xml


Sujet :

Langage PHP

  1. #1
    Fabouney
    Invité(e)
    Par défaut lire un fichier xml
    Bonjour à tous et à toutes,

    je doit en fait lire le contenu d'un fichiers xml, est comparer les valeurs de chaque noeud a des données présentent dans une base de données, et modifier directement le noeud dans le fichier si une valeur différe.

    mon fichier XML se présente ainsi :

    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
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <mobibase>
    <song ident="5089">
    	<title>Let It Be</title>
    	<artist>The Beatles</artist>
    	<date_added>2006-01-04</date_added>
     
    	<date_update>2006-01-09</date_update>
    		<file ident="134">
    			<date_added_file>2006-01-04</date_added_file>
    			<crc32>435948012</crc32>
    			<size>415194</size>
    		</file>
    </song>
    .
    .
    .
    </mobibase>
    serait-il plus judicieux de toute mettre dans un tableau (dans ce cas comment faire cela) et parcourir apres pour comparer ?
    quelle méthode me permetterait de modifier la valeur d'un noeud, du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <crc32>435948012</crc32> en <crc32>154578454</crc32>
    merci d'avance à tous pour vos réponse.

  2. #2
    Membre actif
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2006
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2006
    Messages : 215
    Points : 256
    Points
    256
    Par défaut
    Salut Fabouney,

    Pour parcourir ton fichier XML, tu peux utiliser l'extention PHP SimpleXML


    http://sahid.funraill.org/category/langages/xml/


    voila, j'espere que ca pourra t'aider (:

    sahid

  3. #3
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Et si tu veux passer par l'extension DOM plutôt que SimpleXML (si tu as PHP5, toujours) : http://eusebius.developpez.com/php5dom/
    Dans la dernière partie tu as un exemple de comment transformer un document XML en objet PHP, si ça t'intéresse... Tu peux adapter pour faire un tableau à la place.

  4. #4
    Fabouney
    Invité(e)
    Par défaut
    autre petit question,

    est-il possible de sélectionner directement (plutot que de parcourir tout le fichier sequentiellement) la valeur d'un element dont par exemple son attribut est egal à "toto".

    je vous montre mon XML et vous donne un exemple, ce sera veaucoup plus clair pour vous :

    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
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <mobibase>
    <song ident="5089">
      <title>Let It Be</title>
      <artist>The Beatles</artist>
      <date_added>2006-01-04</date_added>
      <date_update>2006-01-09</date_update>
        <file ident="134">
          <date_added_file>2006-01-04</date_added_file>
          <track_type>Instrumental</track_type>
          <crc32>435948012</crc32>
          <size>415194</size>
      </file>
    </song>
    <song ident="5090">
      <title>Là-bas</title>
      <artist>Jean-Jacques Goldman</artist>
      <date_added>2006-01-05</date_added>
      <date_update>2006-04-27</date_update>
        <file ident="135">
          <date_added_file>2006-01-05</date_added_file>
          <track_type>Instrumental</track_type>
          <crc32>3283162284</crc32>
          <size>821364</size>
         </file>
    </song>
    voila, donc en fait, mon objectif c'est de lister tout les enregistrement des "file" de ma BDD est comparer les valeur du crc de chacun par rapport à ceux du fichier XML, au quel cas, je devrais modifier la valeur de l'élément dans le fichier XML et en regénérer un nouveau.

    le probleme c'est que si j'ai bcp de "file" dans ma BDD, euh ca va un peu etre abusé pour chaque file, parcourir a chaque fois les <file> pour faire le test

    on ne peut pas accéder directement à un element?
    avec simpleXML ou autre.

  5. #5
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par Fabouney
    autre petit question,

    est-il possible de sélectionner directement (plutot que de parcourir tout le fichier sequentiellement) la valeur d'un element dont par exemple son attribut est egal à "toto".
    La réponse (en DOM) est dans le lien que je t'ai donné.

  6. #6
    Fabouney
    Invité(e)
    Par défaut
    en effet, si j'ai bien compris, faut que je passe par une DTD et que je definisse un ID sur l'element en question ?

  7. #7
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par Fabouney
    en effet, si j'ai bien compris, faut que je passe par une DTD et que je definisse un ID sur l'element en question ?
    oui c'est une méthode, si tu ne veux pas boucler sur tous les éléments.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    en effet, si j'ai bien compris, faut que je passe par une DTD et que je definisse un ID sur l'element en question ?
    la je comprend pas bien ce que vient faire une DTD ( et puis les schemas c'est peut etre plus dans l'ére du temps)

    en fin une recherche xpath en simpleXML ou ne dom et c'est fini

  9. #9
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par jeff_!
    la je comprend pas bien ce que vient faire une DTD ( et puis les schemas c'est peut etre plus dans l'ére du temps)
    Parce qu'en DOM, si on veut faire une recherche avec getElementsById, il faut que les ID soient déclarés comme tels dans la DTD sinon ça marche pas (si je me souviens bien)

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    getElementsById,
    j'avais pas compris ou pas vu que tu voulais utiliser cette methode
    autant pour moi

    et sinon il y a peut etre la possibilité d'utilisé sdo, cela serait encore mieux

  11. #11
    Fabouney
    Invité(e)
    Par défaut
    je vais regarder jeff.
    je vous tient au courant.

    sinon pouvez vous me dire ce qu'il cloche dans ma DTD, j'ai cette erreur, qd je veux valider mon fichier XML :

    fichier XML :
    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
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <!DOCTYPE mobibase SYSTEM "songs.dtd">
    <mobibase>
    <song id_song="5089">
    	<title>Let It Be</title>
    	<artist>The Beatles</artist>
    	<date_added>2006-01-04</date_added>
    	<date_update>2006-01-09</date_update>
    		<file id_file="134">
    			<date_added_file>2006-01-04</date_added_file>
    			<track_type>Instrumental</track_type>
    			<crc32>435948012</crc32>
    			<size>415194</size>
    		</file>
    </song>
    <song id_song="5090">
    	<title>Là-bas</title>
    	<artist>Jean-Jacques Goldman</artist>
    	<date_added>2006-01-05</date_added>
    	<date_update>2006-04-27</date_update>
    		<file id_file="135">
    			<date_added_file>2006-01-05</date_added_file>
    			<track_type>Instrumental</track_type>
    			<crc32>3283162284</crc32>
    			<size>821364</size>
    		</file>
    </song>
    </mobibase>
    fichier songs.dtd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <!ELEMENT mobibase ( (song)*,file )>
    <!ELEMENT song (title,artist,date_added,date_update)>
    <!ATTLIST song id_song NMTOKEN #REQUIRED>
    <!ELEMENT title (#PCDATA)>
    <!ELEMENT artist (#PCDATA)>
    <!ELEMENT date_added (#PCDATA)>
    <!ELEMENT date_update (#PCDATA)>
    <!ELEMENT file (date_added_file,track_type,crc32,size)>
    <!ATTLIST file id_file ID #REQUIRED>
    <!ELEMENT date_added_file (#PCDATA)>
    <!ELEMENT track_type (#PCDATA)>
    <!ELEMENT crc32 (#PCDATA)>
    <!ELEMENT size (#PCDATA)>
    erreur :
    a name was started with an invalid character
    source:'<song id_song="5089">'
    line:4, pos:22
    merci

  12. #12
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Tu ne peux mettre que des lettres dans un NMTOKEN

  13. #13
    Fabouney
    Invité(e)
    Par défaut
    avec cette DTD il me met ca comme erreur :

    a name was started whith an invalid character
    source <song id_song="5089">
    par contre si je met des lettre dans la valeur de l'attribut sa passe, mais il me met une erreur sur le id_file par la suite :

    element content is invalid according tothe DTD/schema
    source <file id_file="134">
    la par contre si je met des lettres sa passe toujours pas.

    voici la DTD, mon XML est un peu plus haut.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <!ELEMENT mobibase (song*,file)>
    <!ELEMENT song (title,artist,date_added,date_update)>
    <!ATTLIST song id_song ID #REQUIRED>
    <!ELEMENT title (#PCDATA)>
    <!ELEMENT artist (#PCDATA)>
    <!ELEMENT date_added ANY>
    <!ELEMENT date_update ANY>
    <!ELEMENT file (date_added_file,track_type,crc32,size)>
    <!ATTLIST file id_file ID #REQUIRED>
    <!ELEMENT date_added_file ANY>
    <!ELEMENT track_type (#PCDATA)>
    <!ELEMENT crc32 (#PCDATA)>
    <!ELEMENT size (#PCDATA)>
    désolé de poster ca dans le forum php, mais comme ensuite c'est pour revenir à mon script php, je me permet de faire ca.

    merci de m'aider pour cette DTD sinon je ne pourrais pas utiliser la fonction
    getElementById()
    je vous répéte mon objectif final :

    c'est en fait de parcourir tout les enregistrement "file" de ma base de donnée et de comparer la valeur du crc32 à celle présente dans le fichier XML
    donc en fait pour éviter de parcourir tt le fichier XML pour chaque "file"
    il me faudrait accéder directement au id_file.

    comme m'a expliqué eusebius la méthode getElementById() pourrait être utile

    mais bon je vois pas comment m'y prendre pour modifier directement par exemple le crc32 du "file" dont l'id est égal a 134 par exemple.
    avec ces méthodes.

    merci beaucoup les gars pour votre aide, je doit être lourd à force non ?

  14. #14
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Le numéro que tu entres comme id_file est bien unique ?

  15. #15
    Fabouney
    Invité(e)
    Par défaut
    tout à fait, je ne vois pas l'erreur dans ma DTD :s
    j'ai essayé de virer les caracteres "_" ... etc mais rien y fait
    j'ai mi des type ANY pour les element qui contienne des date en valeur a la place de #PCDATA, j'ai essayé de tout mettre en ANY pareil, les erreurs sont sur les ID, et je ne comprend pas pk

    j'ai check mon xml avec le programme RXD: il me met ca comme erreur :

    Warning: The attribute id_song of element song is declared as ID but contains a
    token that does not start with a name character
    Warning: Content model for song does not allow element file here in unnamed entity
    Warning: The attribute id_file of element file is declared as ID but contains a
    token that does not start with a name character
    Dernière modification par Fabouney ; 26/09/2006 à 10h04.

Discussions similaires

  1. Créer et lire un fichier xml
    Par Bruno1905 dans le forum C++Builder
    Réponses: 14
    Dernier message: 13/06/2007, 11h11
  2. Réponses: 1
    Dernier message: 17/01/2006, 07h42
  3. [DOM XML] Lire un fichier xml
    Par axel-erator dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 07/12/2005, 22h36
  4. lire un fichier xml
    Par stephanie5 dans le forum C++Builder
    Réponses: 6
    Dernier message: 18/11/2005, 16h34
  5. Comment lire un fichier XML ?
    Par jeromelef dans le forum Débuter
    Réponses: 6
    Dernier message: 29/06/2005, 15h52

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