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] Problème d'insertion [Débutant(e)]


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3
    Par défaut [DOM] Problème d'insertion
    Bonjour,

    Voilà, je débute en termes de manipulations de fichier xml , et je rencontre quelques difficultés pour insérer (/ modifier) des éléments dans un noeud.

    J'ai le fichier xml suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <principal>
    <item name="adventure">        
            <item name="game1" pic="game1.jpg" />
            <item name="game2" pic="game2.jpg" />
    </item>
    (...)
    <item name="shoot 'em up">        
            <item name="game126" pic="game1ya.jpg" />
            <item name="game127" pic="game19x.jpg" />
    </item>
    </principal>
    et le code php pour l'insertion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $dom = new DomDocument;
    $dom->load("base.xml");
    $nom1= utf8_decode(htmlspecialchars($_POST['nom1']));
    $pic= '/'.utf8_decode(htmlspecialchars($_POST['pic']));
    $xpath = new DomXPath($dom);
    $root = $xpath->query("//item[@name='".$nom1."']"); 
    $newItem = $dom->createElement("item");
    $newItem->setAttribute("name", $nom1);
    $newItem->setAttribute("pic", $pic);
    $root ->item(0)->appendChild($nouveauItem);
    $dom->save('base.xml');
    Je voudrais savoir si la méthode employée est bonne ( y a des erreurs dans le script que je n'arrive pas à corriger, ça me rend dingue ) . (Cependant l'insertion de nodes est ok.)
    Ensuite l'apostrophe semble poser problème pour la requête "Xpath->query", comment passer outre?

    Merci de bien vouloir m'aider

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Je n'ai pas compris votre code (vous faites une recherche XPath, donc d'un élément existant, pour en recréer un avec le même nom ) mais :
    • Pourquoi utiliser utf8_decode ? C'est certainement un encodage et non un décodage qu'il vous faudrait.
    • Votre expression XPath ne passera pas lorsque votre valeur contiendra également des apostrophes, je n'ai pas de solutions miracles à vous proposer (le remplacement pour les entités correspondantes posant le même problème) si ce n'est d'éventuellement se tourner vers des doubles :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      $root = $xpath->query(sprintf('/principal/item[@name="%s"]', $nom1));
      (à la rigueur on peut adapter l'expression avec PHP en fonction de la valeur)
    • La variable $nouveauItem n'existe pas :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      $root ->item(0)->appendChild($nouveauItem);

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3
    Par défaut
    Je voulais juste insérer un noeud dans un noeud existant, mais la démarche est fausse

    • (Petite) erreur (la variable envoyée par post est déjà décodée...) , et $nouveauItem est une erreur de typo

    • Merci pour cet éclaircissement.


    edit: ok.Reste à ranger le nouvel élément dans le bon noeud parent.

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Il ne vous manque pas une variable (POST) ? Vous devriez, si j'ai bien compris, en avoir une qui permet d'identifier quel élément item sera le parent, ce qui sera la valeur de l'attribut name et celle de l'attribut pic. Donc ça en fait trois.

    Vous aurez bien besoin d'une expression XPath (c'est encore ce qui a de plus simple) pour retrouver celui qui fera office de parent.

    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
    <?php
    define('FICHIER_XML', 'angel.xml');
     
    /**
     * - $_POST['name'] : la valeur de l'attribut name de l'élément item à créer
     * - $_POST['pic'] : la valeur de l'attribut pic de l'élément item à créer
     * - $_POST['item'] : la valeur de l'attribut name d'un élément item existant afin qu'il soit utilisé comme parent du nouvel élément
     **/
     
    if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
        function stripslashes_array($array) {
            return is_array($array) ? array_map('stripslashes_array', $array) : stripslashes($array);
        }
     
        $_POST = stripslashes_array($_POST);
    }
     
    $dom = DomDocument::load(FICHIER_XML);
    $nouvItem = $dom->createElement('item');
    $nouvItem->setAttribute('name', utf8_encode($_POST['name']));
    $nouvItem->setAttribute('pic', utf8_encode($_POST['pic']));
    $xpath = new DomXPath($dom);
    $items = $xpath->query(sprintf('/principal/item[@name="%s"]', utf8_encode($_POST['item'])));
    if ($items) {
        $items->item(0)->appendChild($nouvItem);
    } else {
        die('Erreur XPath');
    }
    // $dom->save(FICHIER_XML);
    echo '<pre>' . htmlspecialchars($dom->saveXML()) . '</pre>';
    Et pour le formulaire, vous pouvez le construire 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
    19
    <form method="post">
        Name : <input type="text" name="name" />
        <br />
        Pic : <input type="text" name="pic" />
        <br />
        Parent : <select name="item">
    <?php
    define('FICHIER_XML', 'angel.xml');
    $dom = DomDocument::load(FICHIER_XML);
    $xpath = new DomXPath($dom);
    $items = $xpath->query('/principal/item') or die('Erreur XPath'); // L'expression XPath n'est pas nécessaire dans tous les cas
    foreach ($items as $item) {
        printf('<option value="%s">%s</option>', htmlentities(utf8_decode($item->getAttribute('name'))), utf8_decode($item->getAttribute('name')));
    }
    ?>
        </select>
        <br />
        <input type="submit" value="Valider" />
    </form>

Discussions similaires

  1. [DOM] problème d'insertion d'un élément?
    Par titoc dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 02/06/2008, 12h25
  2. [DOM][PHP] Problème d'insertion de caractère spécial
    Par Oscar Hiboux dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 09/01/2007, 16h25
  3. [Interbase 7] Problème d'insertion de données
    Par Tuscelan dans le forum InterBase
    Réponses: 12
    Dernier message: 19/11/2003, 22h58
  4. STL : std::set problème avec insert ...
    Par Big K. dans le forum MFC
    Réponses: 13
    Dernier message: 08/11/2003, 01h02
  5. Problème d'insertion avec MySQL
    Par Sonny dans le forum ASP
    Réponses: 13
    Dernier message: 28/08/2003, 13h52

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