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 03/09/2007, 13h03   #1
Membre confirmé
 
Inscription : janvier 2006
Messages : 215
Détails du profil
Informations personnelles :
Localisation : France, Territoire de Belfort (Franche Comté)

Informations forums :
Inscription : janvier 2006
Messages : 215
Points : 211
Points : 211
Par défaut [DOMXML] Modification de valeur dans un fichier XML

Bonjour à tous !

Je recherche une solution pour pourvoir modifier une ou des valeurs dans un fichier XML via le PHP.

Malgrès des recherches sur le site, je n'ai pas trouvé de solution. J'ai pu voir différentes choses mais sans vraiment comprendre comment faire.

Voila mon souci :

J'ai un fichier XML sur un serveur ftp qui ressemble à ceci :

Code XML :
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" ?>
<banlist>
    <ban>
        <datetime>donnee_A1</datetime>
        <nick>donnee_A2</nick>
        <method>donnee_A3</method>
        <period>donnee_A4</period>
        <address>donnee_A5</address>
        <cdkeyhash>donnee_A6</cdkeyhash>
        <profileid>donnee_A7</profileid>
        <by>donnee_A8</by>
        <reason>donnee_A9</reason>
    </ban>
    <ban>
        <datetime>donnee_B1</datetime>
        <nick>donnee_B2</nick>
        <method>donnee_B3</method>
        <period>donnee_B4</period>
        <address>donnee_B5</address>
        <cdkeyhash>donnee_B6</cdkeyhash>
        <profileid>donnee_B7</profileid>
        <by>donnee_B8</by>
        <reason>donnee_B9</reason>
    </ban>
</banlist>
Grâce à mes différentes recherches sur le site, j'ai réussi à lire le fichier XML et à afficher les données "nick" sous forme de lien et à les mettre dans un tableau

Ce que j'aimerais pouvoir faire, c'est lorsque je clique sur un des lien, j'ouvre une nouvelle page afin de pouvoir changer toutes les valeurs des noeuds correspondant au nick selectionné via un formulaire.

Par exemple, si sur ma page tableau, je clique sur "donnéeA2", je bascule sur une nouvelle page avec dans un formulaire les valeurs donneeA1, A3, A4 etc...

Mais je ne sais comment faire :
- pour afficher uniquement les valeurs d'après le "nick" selectionné
- modifier et enregistrer les nouvelles valeurs

L'un de vous peut-il m'aider ?

En vous en remerciant d'avance
scorpion1611 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2007, 13h12   #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
Citation:
Envoyé par scorpion1611
- pour afficher uniquement les valeurs d'après le "nick" selectionné
Le plus simple serait l'extension SimpleXML (PHP 5) combiné à XPath ou à défaut utiliser une extension DOM.

Citation:
Envoyé par scorpion1611
- modifier et enregistrer les nouvelles valeurs
C'est plutôt le travail des extensions dom (PHP 5) et domxml (PHP 4).

A voir :
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2007, 13h23   #3
Membre confirmé
 
Inscription : janvier 2006
Messages : 215
Détails du profil
Informations personnelles :
Localisation : France, Territoire de Belfort (Franche Comté)

Informations forums :
Inscription : janvier 2006
Messages : 215
Points : 211
Points : 211
Merci Julp pour tes liens mais je les ai déjà parcouru mais sans grand succès.

Pour lire et afficher les données "Nick", j'utilise SimpleXML


Pour modifier des valeurs, j'ai bien trouvé ce post
http://www.developpez.net/forums/d74247/php/bibliotheques-frameworks/xml/dom/dom-changer-contenu-noeud/

mais chez lui, les noeuds parents sont uniques (<parent id="1">, <parent id="2"> etc). Chez moi, ils sont "anonymes"

J'ai bien trouvé d'autres posts mais j'en arrive à tout mélanger (dom, simplexml, etc...) et je ne sais plus comment faire pour construire le code
scorpion1611 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2007, 18h19   #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
Voilà comment j'aurais écrit ça (avec DOM finalement) :
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
<?php
define('DEBUG', TRUE);
define('FICHIER_XML', 'mm_bans.xml');
 
$dom = new DomDocument();
$dom->preserveWhiteSpace = FALSE;
$dom->formatOutput = TRUE;
$dom->load(FICHIER_XML);
$xpath = new DOMXPath($dom);
 
if (defined('DEBUG') && DEBUG) {
    echo '<pre>';
    print_r($_POST);
    echo '</pre>';
}
 
/**
 * Première étape : lister les nick
 * Deuxième étape : proposer un formulaire pour modifier cette partie du ban
 * Troisième étape : modifier le fichier XML
 *
 * Bug (?) : les double quotes ne passent pas dans l'expression XPath
 **/
 
if (!isset($_POST['nick'])) {
    $nicks = $xpath->query('/banlist/ban/nick');
    echo '<form method="POST">';
    echo '<select name="nick">';
    foreach ($nicks as $nick) {
       printf('<option>%s</option>', utf8_decode($nick->nodeValue));
    }
    echo '</select>';
    echo '<input type="submit" value="Valider"/>';
    echo '</form>';
} else if (isset($_POST['nick']) && count($_POST) == 1) { // Mode fainéant
    $ban = $xpath->query(sprintf('/banlist/ban[nick = "%s"]', utf8_encode($_POST['nick'])));
    echo '<form method="POST">';
    foreach ($ban->item(0)->getElementsByTagName('*') as $elt) {
        if ($elt->nodeName != 'nick') {
            printf('%s : <input type="text" name="%s" value="%s" /><br />', utf8_decode($elt->nodeName), utf8_decode($elt->nodeName), utf8_decode($elt->nodeValue));
        } else {
            printf('<input type="hidden" name="%s" value="%s" /><br />', utf8_decode($elt->nodeName), utf8_decode($elt->nodeValue));
        }
    }
    echo '<input type="submit" value="Modifier" />';
    echo '</form>';
} else if (isset($_POST['nick']) && count($_POST) > 1) {
    $ban = $xpath->query(sprintf('/banlist/ban[nick = "%s"]', utf8_encode($_POST['nick'])));
    foreach ($ban->item(0)->getElementsByTagName('*') as $elt) {
        if ($elt->nodeName != 'nick') {
            $elt->nodeValue = utf8_encode($_POST[$elt->nodeName]);
        }
    }
    if (defined('DEBUG') && DEBUG) {
        echo '<pre>' . htmlentities($dom->saveXML()) . '</pre>';
    } else {
        $dom->save(FICHIER_XML);
    }
} else if (defined('DEBUG') && DEBUG) {
    die("Houston on a un problème :S");
}
Les cas particuliers méritent attention (caractères spéciaux et encodages)
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2007, 18h54   #5
Membre confirmé
 
Inscription : janvier 2006
Messages : 215
Détails du profil
Informations personnelles :
Localisation : France, Territoire de Belfort (Franche Comté)

Informations forums :
Inscription : janvier 2006
Messages : 215
Points : 211
Points : 211
Je te remercie de ta réponse Julp et surtout de ton code.

Voici les messages d'erreur que j'obtiens

En premier j'ai les infos suivantes qui apparaissent avec la liste déroulante + bouton "valider"

Code :
1
2
3
4
5
Array
(
)

champ liste déroulante + bouton
Ensuite, lorsque je sélectionne une valeur dans la liste déroulante j'obtiens soit ce résultat :

Code :
1
2
3
4
5
6
7
Array
(
    [nick] => Thoor
)
 
 
Fatal error: Call to a member function getElementsByTagName() on a non-object in (le chemin) on line 57
soit :
Code :
1
2
3
4
5
6
7
Array
(
    [nick] => Thoor

+ les différents champs qui s'affichent correctement

)
Ensuite lorsque je modifie une valeur et que je valide, j'obtiens une copie du fichier XML qui s'affiche sur ma page avec les modifications effectuées.

sauf que lorsque je vais voir dans le fichier XML, aucune modif n'est prise en compte


Pour info, le fichier se trouve sur un serveur ftp
A la place de "scorpion.xml", j'ai mis :
ftp://user:mot de passe@adresse IP/chemin/chemin/fichier.xml

est-ce correct car dès fois, j'obtiens le message d'erreur suivant :
Code :
Warning: DOMDocument::load() [function.DOMDocument-load]: I/O warning : failed to load external entity blablabla
Une chose encore, les valeurs pour "nick" peuvent être n'importe quoi du style :
- nono@roazon
- !TOP! 00.Terror.00
- [SWIZZ]=R.A.F.j=
etc...



Encore une fois merci pour ton aide si précieuse
scorpion1611 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2007, 19h29   #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 scorpion1611
Code :
Fatal error: Call to a member function getElementsByTagName() on a non-object in (le chemin) on line 57
L'expression XPath ne doit pas retourner le noeud voulu mais ça dépend du contexte (caractères spéciaux, autre erreur, ...).

Citation:
Envoyé par scorpion1611
Ensuite lorsque je modifie une valeur et que je valide, j'obtiens une copie du fichier XML qui s'affiche sur ma page avec les modifications effectuées.

sauf que lorsque je vais voir dans le fichier XML, aucune modif n'est prise en compte
C'est voulu : c'est l'effet du mode debug car souvent en testant on écrase son fichier avec un arbre vide (c'est une méthode parmi d'autres : sauvegarde sous un autre nom, copie de l'original avant, déplacement de l'original après la lecture, etc).

Note : PHP sait, en temps normal, gérer les flux FTP. Tout dépend de votre configuration qui requière allow_url_fopen à On et la prise en charge du protocole FTP(S) par PHP. Vous pouvez obtenir toutes ces informations dans un phpinfo, la dernière se situant dans le premier tableau.

Citation:
Envoyé par scorpion1611
Code :
Warning: DOMDocument::load() [function.DOMDocument-load]: I/O warning : failed to load external entity blablabla
Vous n'auriez pas un caractère & qui traine tout seul devant ce blabla (au lieu de &amp; ou bien il faut le placer dans une section CDATA) ?

Citation:
Envoyé par scorpion1611
Une chose encore, les valeurs pour "nick" peuvent être n'importe quoi du style :
- nono@roazon
- !TOP! 00.Terror.00
- [SWIZZ]=R.A.F.j=
etc...
Si vous pouviez me fournir une copie de ce fichier (éventuellement par MP) afin de disposer d'un réel jeu de test, ça en sera plus facile et d'autant plus réaliste que l'actuel
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2007, 19h46   #7
Membre confirmé
 
Inscription : janvier 2006
Messages : 215
Détails du profil
Informations personnelles :
Localisation : France, Territoire de Belfort (Franche Comté)

Informations forums :
Inscription : janvier 2006
Messages : 215
Points : 211
Points : 211
Par défaut Encore merci...

du temps que vous consacrez à mon problème
Ci-joint le fichier
scorpion1611 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2007, 19h52   #8
Membre confirmé
 
Inscription : janvier 2006
Messages : 215
Détails du profil
Informations personnelles :
Localisation : France, Territoire de Belfort (Franche Comté)

Informations forums :
Inscription : janvier 2006
Messages : 215
Points : 211
Points : 211
Citation:
Envoyé par julp Voir le message
L'expression XPath ne doit pas retourner le noeud voulu Tout dépend de votre configuration qui requière allow_url_fopen à On et la prise en charge du protocole FTP(S) par PHP.
D'après phpinfo, c'est ok.

Par contre, je viens de m'apercevoir que c'est la version php 4 et non la 5 qui est installée
scorpion1611 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2007, 11h19   #9
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 scorpion1611
Par contre, je viens de m'apercevoir que c'est la version php 4 et non la 5 qui est installée
C'est sûr ? Parce que vous aviez évoqué SimpleXML plus tôt. Sinon il n'y a plus qu'à faire l'adaptation pour domxml
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2007, 11h24   #10
Membre confirmé
 
Inscription : janvier 2006
Messages : 215
Détails du profil
Informations personnelles :
Localisation : France, Territoire de Belfort (Franche Comté)

Informations forums :
Inscription : janvier 2006
Messages : 215
Points : 211
Points : 211
Citation:
Envoyé par julp Voir le message
C'est sûr ?

Oui c'est sur. D'ailleurs, j'avais même trouvé l'astuce sur Developpez.com pour faire fonctionner simpleXML sur PHP4 en mettant la valeur 5 après l'extension .PHP soit .PHP5
scorpion1611 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2007, 11h45   #11
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 scorpion1611
Oui c'est sur. D'ailleurs, j'avais même trouvé l'astuce sur Developpez.com pour faire fonctionner simpleXML sur PHP4 en mettant la valeur 5 après l'extension .PHP soit .PHP5
Euh non, ce n'est pas spécialement pour utiliser SimpleXML qui n'est pas une extension PHP 4 mais pour utiliser PHP 5 (qui fournit SimpleXML et DOM normalement).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2007, 11h55   #12
Membre confirmé
 
Inscription : janvier 2006
Messages : 215
Détails du profil
Informations personnelles :
Localisation : France, Territoire de Belfort (Franche Comté)

Informations forums :
Inscription : janvier 2006
Messages : 215
Points : 211
Points : 211
Citation:
Envoyé par julp Voir le message
Euh non, ce n'est pas spécialement pour utiliser SimpleXML qui n'est pas une extension PHP 4 mais pour utiliser PHP 5 (qui fournit SimpleXML et DOM normalement).
Ben c'est ce que je dis mais mal ecrit

J'ai utilisé l'astuce extension PHP5 pour utiliser simpleXMl sur un serveur ou PHP version 4 est installée
scorpion1611 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2007, 11h57   #13
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Citation:
Envoyé par scorpion1611 Voir le message
Ben c'est ce que je dis mais mal ecrit

J'ai utilisé l'astuce extension PHP5 pour utiliser simpleXMl sur un serveur ou PHP version 4 est installée
Non. Cette astuce permet de forcer l'utilisation de php5 sur un serveur ou php4 et php5 sont installés je pense. Parce que sinon la version de PHP prise par défaut (quand tu ne précises rien) serait php4
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2007, 12h09   #14
Membre confirmé
 
Inscription : janvier 2006
Messages : 215
Détails du profil
Informations personnelles :
Localisation : France, Territoire de Belfort (Franche Comté)

Informations forums :
Inscription : janvier 2006
Messages : 215
Points : 211
Points : 211
Citation:
Envoyé par koopajah Voir le message
Non. Cette astuce permet de forcer l'utilisation de php5 sur un serveur ou php4 et php5 sont installés je pense. Parce que sinon la version de PHP prise par défaut (quand tu ne précises rien) serait php4
Ben alors j'ai rien compris alors

Quand j'écris un petit bout de code utilisant simpleXML et que je l'enregistre sous le nom "tartanpion.php", il ne marche pas sur mon site.
Si je l'enregistre sous le nom "tartanpion.php5", ca marche

D'après phpinfo, mon hebergeur (OVH) utilise PHP 4.4.7

cela signifie-t-il que PHP version 5 est aussi installée ?

Je suis un peu perdu là!
scorpion1611 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/09/2007, 13h12   #15
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
Il faudrait se renseigner sur leur site et/ou consulter le forum qui leur est consacré (OVH) mais il me semble que l'on peut changer la version par défaut de PHP (sous-entendu associée à l'extension .php : SetEnv PHP_VER 5 dans un fichier .htaccess ?). Cela dépendra éventuellement de votre "offre".

Quant au phpinfo, s'il porte une extension .php au lieu de .php5 il est tout à fait normal par rapport à la configuration actuelle qu'il vous indique une version 4.X.Y au lieu de 5 ... Je vous répète que l'extension SimpleXML requiert une version 5, il est notamment question d'exploiter les nouvelles possibilités objets de PHP (API PHP/Zend interne) que PHP 4 n'offre pas (implémentation des méthodes spéciales comme __get) :
Citation:
Envoyé par http://fr.php.net/simplexml
L'extension SimpleXML requiert PHP 5.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2007, 08h32   #16
Membre confirmé
 
Inscription : janvier 2006
Messages : 215
Détails du profil
Informations personnelles :
Localisation : France, Territoire de Belfort (Franche Comté)

Informations forums :
Inscription : janvier 2006
Messages : 215
Points : 211
Points : 211
Citation:
Envoyé par julp Voir le message
C'est voulu : c'est l'effet du mode debug car souvent en testant on écrase son fichier avec un arbre vide (c'est une méthode parmi d'autres : sauvegarde sous un autre nom, copie de l'original avant, déplacement de l'original après la lecture, etc).

J'ai pas trop compris ce que vous dire.

Comment faut-il faire pour écrire directement dans le fichier ?

En vous remerciant par avance
scorpion1611 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2007, 11h08   #17
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 julp Voir le message
Vous la supprimez ou lui affectez une valeur fausse
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2007, 14h53   #18
Membre confirmé
 
Inscription : janvier 2006
Messages : 215
Détails du profil
Informations personnelles :
Localisation : France, Territoire de Belfort (Franche Comté)

Informations forums :
Inscription : janvier 2006
Messages : 215
Points : 211
Points : 211
Citation:
Envoyé par julp Voir le message
Vous la supprimez ou lui affectez une valeur fausse
D'accord,

Merci pour tout en tout cas
scorpion1611 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 00h17.


 
 
 
 
Partenaires

Hébergement Web