Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > DOMXML
DOMXML Forum d'entraide pour l'extension DOMXML permettant de manipuler des documents XML en PHP 4 (approche DOM). Avant de poster -> tutoriels DOMXML
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/10/2007, 17h57   #1
Membre du Club
 
Inscription : avril 2007
Messages : 233
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : avril 2007
Messages : 233
Points : 60
Points : 60
Par défaut [DOMXML] Un souci avec un script

salut,

Le code ci dessous je l'ai copié du web

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
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
<?php

<xml version="1.0" encoding="ISO-8859-1">
<XML_EXEMPLE>
  <profil>
  	<id>200</id>
  	<prenom>Koogi</prenom>
  </profil>
  <profil>
  	<id>300</id>
  	<prenom>PSAS</prenom>
  </profil>
</XML_EXEMPLE>

<?
// FONCTION qui va lire le fichier XML et le placer dans un tableau
// Cette fonction sert de parseur

function lit_xml($fichier,$item,$champs) {
   // on lit le fichier
   if($chaine = @implode("",@file($fichier))) {
      // on explode sur <item>
      // Dans l'exemple il s'agit de 'profil'
      $tmp = preg_split("/<\/?".$item.">/",$chaine);
      // pour chaque <item> donc tous les profils
      for($i=1;$i<sizeof($tmp)-1;$i+=2)
         // on lit les champs demandés <champ> donc il s'agit de 'id' et 'prenom'
         foreach($champs as $champ) {
            $tmp2 = preg_split("/<\/?".$champ.">/",$tmp[$i]);
            // on ajoute l'élément au tableau
            $tmp3[$i-1][] = @$tmp2[1];
         }
      // et on retourne le tableau dans la fonction
      return $tmp3;
   }
}

// Lecture du FLUX XML sur le serveur
$xml = lit_xml("http://www.site.com/flux.xml","profil",array("id","prenom"));

// Une petite boucle suffit pour retrouver les élément du tableau
// retourné dans la fonction lit_xml()
foreach($xml as $row) { // ligne 47

  echo $row[0];
  // affiche 200
  echo $row[1];
  // affiche Koogi

  }

?>
Le code m'affiche le contenu du fichier XML mais en plus il affiche aussi une erreur:
Citation:
Warning: Invalid argument supplied for foreach() in C:\Program Files\EasyPHP 2.0\www\Untitled-1.php on line 47
J'aimerai savoir la cause de cette erreur si vous avez une idée

merci
__________________
Il faut parfois servir pour mieux dériger..
namstou3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2007, 18h10   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Parce que votre fonction lit_xml ne retourne pas un tableau comme prévu et ce n'est pas en plaçant des arobases sur les instructions pouvant poser problème que vous en aurez la cause. Cela dit, pourquoi passer par les expressions régulières alors que sous PHP 5 vous avez plusieurs possibilités standards : SimpleXML, DOM, XMLReader, XML (SAX/Expat) ?
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2007, 18h19   #3
Membre du Club
 
Inscription : avril 2007
Messages : 233
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : avril 2007
Messages : 233
Points : 60
Points : 60
Merci julp pour ta réponse mais je tiens vraiment à ne pas travailler avec PHP 5 puisque dans le serveur c'est easyphp 1.8 qu'est installé alors je ne vx pa prendre le risque de le supprimer pour passer easyphp 2.0 puisque toute mes application sont faites avec php 4.
__________________
Il faut parfois servir pour mieux dériger..
namstou3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2007, 18h44   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par namstou3
mais je tiens vraiment à ne pas travailler avec PHP 5 puisque dans le serveur c'est easyphp 1.8 qu'est installé alors je ne vx pa prendre le risque de le supprimer pour passer easyphp 2.0 puisque toute mes application sont faites avec php 4.
Grave erreur : PHP 4 tire progressivement sa révérence et ne sera à terme plus maintenu ! Le passage à PHP 5, n'offre que des avantages (mis à part la migration bien sûr à l'égard de certains aspects) et si vous faites parti des derniers à utiliser PHP 4 pendant que la majorité utilise PHP 5 (c'est déjà le cas), vous allez rencontrez bien des difficultés à obtenir de l'aide (de nouvelles fonctions sont apparues, leurs paramètres et le fonctionnement interne de PHP évoluent, dont notamment, et de manière conséquente, au niveau objet). Je pense que vous devriez tout de même sérieusement étudier la question

Pourquoi y a-t-il une balise PHP avant votre document XML ? Et votre document XML n'est pas tout à fait correct :
Code :
<?xml version="1.0" encoding="ISO-8859-1"?>
Sinon votre "script" fonctionne. Vous devriez retirer les arobases pour en savoir davantage (erreur sur le chemin, allow_url_fopen à Off - d'ailleurs il n'est probablement pas nécessaire de passer par une URL HTTP ici, autres).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2007, 19h05   #5
Membre du Club
 
Inscription : avril 2007
Messages : 233
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : avril 2007
Messages : 233
Points : 60
Points : 60
Merci beaucoup julp pour le conseil, t'a tout à fais raison.. Sinon mon problème est résolu. Il me faut juste un petit truc.

Mon code est le suivant (un nouveau code):

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
28
29
30
31
32
33
34
35
36
 
<?php
    $fichier = "apcvm_all.xml";
 
    // Ma propre fonction de traitement du texte
    // qui est appelée par le "parseur"
    function fonctionTexte($parseur, $texte)
    {
        // Dans l'immédiat nous nous contentons d'afficher
        // le texte brut accompagné d'un simple retour à la ligne
        echo $texte."<br/>";
    }
 
    // Création du parseur XML
    $parseurXML = xml_parser_create();
 
    // Je précise le nom de la fonction a appeler
    // lorsque du texte est rencontré
    xml_set_character_data_handler($parseurXML, "fonctionTexte");
 
    // Ouverture du fichier
    $fp = fopen($fichier, "r");
    if (!$fp) die("Impossible d'ouvrir le fichier XML");
 
    // Lecture ligne par ligne
    while ( $ligneXML = fgets($fp, 1024)) {
        // Analyse de la ligne
        // REM: feof($fp) retourne TRUE s'il s'agit de la dernière
        //      ligne du fichier.
        xml_parse($parseurXML, $ligneXML, feof($fp)) or
            die("Erreur XML");
    }
 
    xml_parser_free($parseurXML);
    fclose($fp);
?>
ça m'affiche exactement le contenu de mon fichier XML, mais ce que je veux c'est ne pas tous affiché, je veux par exemple mettre un liste déroulante ça dépend du choix que je fais ça m'affiche seulement le contenu de la sélection. Avez-vous une idée??

Merci
__________________
Il faut parfois servir pour mieux dériger..
namstou3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2007, 00h26   #6
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par namstou3
je veux par exemple mettre un liste déroulante ça dépend du choix que je fais ça m'affiche seulement le contenu de la sélection. Avez-vous une idée??
Sélection de quoi ? Contenu de quoi ?
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2007, 11h23   #7
Membre du Club
 
Inscription : avril 2007
Messages : 233
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : avril 2007
Messages : 233
Points : 60
Points : 60
Désolé je crois que je n'étais pas clair dans mon message, au fait voilà par exemple mon fichier XML:

Citation:

<opcvm_all>
<opcvm id="4">
<date>01/01/2007</date>
<vl>0000</vl>
<trois_ans>2007</trois_ans>
<un_an>2007</un_an>
<six_mois>2007</six_mois>
</opcvm>
<opcvm id="3">
<date>01/01/2007</date>
<vl>1111</vl>
<trois_ans>0000</trois_ans>
<un_an>0000</un_an>
<six_mois>0000</six_mois>
</opcvm>
</opcvm_all>
je veux récupérer les attributs (id dans l'exemple) et les afficher dans une liste déroulante et une fois je choisi l'id voulu, ça m'affiche comme résultat le contenue.. D'après l'exemple j'aurai dans ma liste déroulante 1 et 3 si je choisi 3, j'aurai:
Citation:
<date>01/01/2007</date>
<vl>1111</vl>
<trois_ans>0000</trois_ans>
<un_an>0000</un_an>
<six_mois>0000</six_mois>
et ainsi de suite

Merci
__________________
Il faut parfois servir pour mieux dériger..
namstou3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2007, 12h12   #8
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
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
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
<?php
$fichier = 'opcvm_all.xml';
$parseur = xml_parser_create();
 
if ($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['id'])) {
    $display = FALSE;
 
    function startDocument() {}
 
    function endDocument() {}
 
    function startElement($parser, $name, $attrs) {
        if ($GLOBALS['display']) {
            echo "&lt;$name&gt;";
        }
        if (!strcasecmp($name, 'opcvm') && $attrs['ID'] == $_POST['id']) {
            $GLOBALS['display'] = TRUE;
        }
    }
 
    function endElement($parser, $name) {
        if ($GLOBALS['display']) {
            if (!strcasecmp($name, 'opcvm')) {
                $GLOBALS['display'] = FALSE;
            } else {
                echo "&lt;/$name&gt;<br/>";
            }
        }
    }
 
    function characterData($parseur, $data) {
        if ($GLOBALS['display']) {
            echo $data;
        }
    }
 
    xml_set_element_handler($parseur, 'startElement', 'endElement');
    xml_set_character_data_handler($parseur, 'characterData');
} else {
 
    function startDocument() {
        echo '<form method="post">';
        echo 'Id : <select name="id">';
    }
 
    function endDocument() {
        echo '</select>';
        echo '<br />';
        echo '<input type="submit" value="Valider" />';
        echo '</form>';
    }
 
    function startElement($parser, $name, $attrs) {
        if (!strcasecmp($name, 'opcvm') && isset($attrs['ID'])) {
            echo '<option>' . $attrs['ID'] . '</option>';
        }
    }
 
    function endElement($parser, $name) {}
 
    xml_set_element_handler($parseur, 'startElement', 'endElement'/*FALSE*/);
}
 
$fp = fopen($fichier, 'r');
if (!$fp) die("Impossible d'ouvrir le fichier XML");
startDocument();
while ($ligneXML = fgets($fp, 1024)) {
    xml_parse($parseur, $ligneXML, feof($fp)) or die(sprintf("Erreur XML : %s à la ligne %d", xml_error_string(xml_get_error_code($parseur)), xml_get_current_line_number($parseur)));
}
endDocument();
xml_parser_free($parseur);
fclose($fp);
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2007, 15h25   #9
Membre du Club
 
Inscription : avril 2007
Messages : 233
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : avril 2007
Messages : 233
Points : 60
Points : 60
Merci julp pour ta réponse mais ça ne marche pas, voilà l'erreur qu'il m'affiche à l'exécution.

Citation:
Warning: fopen(opcvm_all.xml) [function.fopen]: failed to open stream: No such file or directory in C:\Program Files\EasyPHP 2.0\www\test.php on line 64
Impossible d'ouvrir le fichier XML
j'ai essayé de résoudre le problème mais j'ai pas réussi, t'as une idée??

Merci
__________________
Il faut parfois servir pour mieux dériger..
namstou3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2007, 15h47   #10
Membre du Club
 
Inscription : avril 2007
Messages : 233
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : avril 2007
Messages : 233
Points : 60
Points : 60
Non au fait c'est bon julp j'ai réglé le problème (mon fichier XML n'était pas au bon emplacement) et ça marche nikel

Merci beaucoup
__________________
Il faut parfois servir pour mieux dériger..
namstou3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h53.


 
 
 
 
Partenaires

Hébergement Web