Liste avec fichier xml

Eléphanteau du PHP | 12 Messages

31 mars 2010, 20:13

Bonjour à tous,

Alors voilà je vous expose mon problème, j'ai un fichier .xml dans cette configuration là :
<items>
<item id="1">
<title>test</title>
<description>test</description>
</item>
</items>
Et avec l'aide d'un fichier php, j'aimerais tout d'abord afficher les éléments "<item>" dans une liste puis pouvoir supprimer un élément choisit suivant son id..

J'ai donc essayé de faire cela comme ceci :
  <?php 
  $dom = new DomDocument;
  $dom->load("../news.xml");
  $listeItem = $dom->getElementsByTagName('item');
  foreach($listeItem as $item)
    echo $item->firstChild->nodeValue . "<br />"; 
   ?>
Le problème c'est que cela ne m'affiche rien du tous alors que si je met par exemple pour le TagName "<description>" cela marche parfaitement.

Donc si quelqu'un peux m'éclairer sur ce problème ?

Merci d'avance

Mammouth du PHP | 672 Messages

01 avr. 2010, 09:22

Bonjour.

1. Il y a un sous-forum XML, ton sujet y aurait peut-être plus sa place.

2. Tu veux afficher quoi, au juste ?
Si on prend ton exemple de fichier XML, quel serait le résultat attendu ?

Essaye :
echo "<p>".$item->firstChild->nodeValue."</p>"; pour voir - dans le source - si le nodeValue te renvoie quelque chose, ou si c'est réellement vide.

J'ai testé, ça renvoie bien quelque chose...
Le "truc", c'est que ton fichier XML est bien indenté, et tout. Du coup, pour Domdocument, le "firstChild" de item, c'est la chaîne de caractère qui se trouve juste après la balise <item id="1">. C'est à dire le retour à la ligne...

La meilleure solution, à mon avis, c'est d'appeler le noeud enfant par son nom. Comme ça si tu changes l'ordre pour une raison ou une autre tu n'as pas à refaire le code. Ca te simplifiera la maintenance...

Eléphanteau du PHP | 12 Messages

01 avr. 2010, 13:07

Bonjour.

1. Il y a un sous-forum XML, ton sujet y aurait peut-être plus sa place.

2. Tu veux afficher quoi, au juste ?
Si on prend ton exemple de fichier XML, quel serait le résultat attendu ?

Essaye :
echo "<p>".$item->firstChild->nodeValue."</p>"; pour voir - dans le source - si le nodeValue te renvoie quelque chose, ou si c'est réellement vide.

J'ai testé, ça renvoie bien quelque chose...
Le "truc", c'est que ton fichier XML est bien indenté, et tout. Du coup, pour Domdocument, le "firstChild" de item, c'est la chaîne de caractère qui se trouve juste après la balise <item id="1">. C'est à dire le retour à la ligne...

La meilleure solution, à mon avis, c'est d'appeler le noeud enfant par son nom. Comme ça si tu changes l'ordre pour une raison ou une autre tu n'as pas à refaire le code. Ca te simplifiera la maintenance...
Salut, merci de me donner un petit main, en faite mon fichier xml est un fichier dans lequel j'y ajoute des news, et donc j'aimerais pouvoir faire une liste des éléments "<item>" pour pouvoir les supprimer en les cochant par exemple.

Et le code que tu m'as donné ne m'affiche rien, mais si je met "<title>" sa m'affiche le denier élément de mon xml

ViPHP
ViPHP | 5462 Messages

01 avr. 2010, 13:13

quelle ID tu veux surppimer ? tu peu utiliser Xpath pour ca

Eléphanteau du PHP | 12 Messages

01 avr. 2010, 13:35

quelle ID tu veux surppimer ? tu peu utiliser Xpath pour ca
Bah en faite mon fichier xml est comme ceci

<items>
<item id="1">
<title>test</title>
<description>test</description>
</item>

<item id="2">
<title>test</title>
<description>test</description>
</item
</items>

Donc j'aimerais supprimer tous ce qui est en gras ( l'item 1).

ViPHP
ViPHP | 5462 Messages

01 avr. 2010, 13:55

juste l'item 1 ?

EDIT : le premier ? ou celui qui est item 1 ?

ViPHP
ViPHP | 5462 Messages

01 avr. 2010, 14:14

$dom = new DomDocument();
$dom->load('data.xml');
	
$xpath  = new DOMXPath($dom);
$query	= $xpath->query('//item')->item(0);
//$query= $xpath->query('//item[@id="1"]')->item(0); //si avec id 
	
$dom->documentElement->removeChild($query);
	
echo $dom->saveXML();

Eléphanteau du PHP | 12 Messages

01 avr. 2010, 14:26

$dom = new DomDocument();
$dom->load('data.xml');
	
$xpath  = new DOMXPath($dom);
$query	= $xpath->query('//item')->item(0);
//$query= $xpath->query('//item[@id="1"]')->item(0); //si avec id 
	
$dom->documentElement->removeChild($query);
	
echo $dom->saveXML();
Oui je veux bien supprimer l'élément item 1, ta solution marche parfaitement, néanmoins j'ai une petite question, ce que tu viens de proposer ne supprime pas physiquement dans le xml les lignes ? sa le retire juste c'est ça ? ( Parce que l'item 1 est toujours dans mon xml )

ViPHP
ViPHP | 5462 Messages

01 avr. 2010, 14:28

pour supprimer physiquement utilise save

devlop78
Invité n'ayant pas de compte PHPfrance

01 avr. 2010, 14:34

C'est drôle j'avais jamais entendu parler de domDocument. Cela dit je suis pas très XML puisque un jour j'ai fait une liste de département en XML, j'ai voulu utiliser une librairie php qui dénoue (lol) les noeuds etc pour faire une recherche Code postal -> ville, et ça mettait 3 plombes. En faisant un fichier avec un code postal séparé de la ville par un "|", j'ai fait un petit code php qui s'éxecutait 30 fois plus vite ... et si ça avait été Mysql ça aurait été aussi rapide ...

Pour en revenir, en fait tu traites ton fichier de la meme manière que javascript ... ??? Heureusement je vais avoir un module de 35h sur XML ^^

ViPHP
ViPHP | 5462 Messages

01 avr. 2010, 14:38

DomDocument c'est le bien :mrgreen: , (autant pour les XML que pour du HTML)

devlop78
Invité n'ayant pas de compte PHPfrance

01 avr. 2010, 14:41

OUai

$dom->getElementsByTagName('item')

Ca me fait penser à Javascript Loool ... qui utilise DOM aussi tu vas me dire. Mais ça c'est cool. Quand tout respecte les normes et fonctionne de la même manière, on a qqchose de cohérent ... Si seulement ça pouvait être le cas (reconnaissance du sélecteur ">" CSS par IE 6 par exemple, pour ne citer que ça :))

ViPHP
ViPHP | 5462 Messages

01 avr. 2010, 14:45

IE6 c'est le mal :mrgreen:

devlop78
Invité n'ayant pas de compte PHPfrance

01 avr. 2010, 14:46

Ouai en plus quand je crée de beau PNG les fonds transparents sont tout gris :evil: :twisted: :twisted:

Eléphanteau du PHP | 12 Messages

01 avr. 2010, 15:34

pour supprimer physiquement utilise save
Merci beaucoup stealth c'est exactement ce que je rechercher !

Bonne journée à vous tous et merci encore.