Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > DOM
DOM Forum d'entraide pour l'extension DOM permettant de manipuler des documents XML en PHP 5 (approche DOM). Avant de poster -> tutoriels DOM
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 19/10/2007, 08h18   #1
Invité de passage
 
Inscription : octobre 2007
Messages : 3
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3
Points : 0
Points : 0
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 :
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 :
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
angel 2004 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2007, 11h47   #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
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 :
    $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 :
    $root ->item(0)->appendChild($nouveauItem);
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2007, 12h24   #3
Invité de passage
 
Inscription : octobre 2007
Messages : 3
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3
Points : 0
Points : 0
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.
angel 2004 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2007, 13h44   #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
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 :
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 :
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>
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h34.


 
 
 
 
Partenaires

Hébergement Web