Forum Clubic

[PHP] Ecrire un XML pour RSS - Impossible? o_O

Bonjour,

J’ai un soucis ennuyant :confused: ! Je me lance dans l’écriture de RSS pour mon site, et je me heurte à un problème sans trouver de réelle solution. J’explique mon problème :

J’ai mon fichier RSS en XML sous la forme traditionnelle suivante :

[Header]

 [Item2]
 [Item1]
 ...

[Footer]

Mon problème est donc d’écrire un [Item3] avant le [Item2] dans mon fichier. Vous me direz tout bêtement :

  • Tu lis ton fichier
  • Tu l’effaces
  • Tu ré-écrits avec le [Item3]
    Et hop le tour est joué !

Problème : D’ici un mois je risque d’avoir facile 100 Items, si je dois à chaque fois ré-écrire mon fichier sachant qu’il va chercher l’item dans ma base de donnée, j’ai pas finie…

Solutions envisagées :

  • Essayer d’insérer des lignes sans devoir ré-écrire la fin du fichier (apparement c’est impossible d’après 2-3 forums)
  • Limiter mes fichiers XML à 30 Items (par exemple), mais dans ce cas là comment faire pour tous les répertorier en une seule adresse pour que d’autres sites puisse les lire sans jamais avoir l’adresse qui change? Des bêtes includes php avec un GET pour un XML de 30 Items?
  • Suicide?

Tu peux jouer avec DOM, qui est là pour ça : tu lis le fichier, tu as un arbre DOM, et tu demande d’insérer un noeud avant ou après celui de ton choix, et puis tu sauvegarde.

Hum ha ouai ça résoudrais tranquilement mon problème, j’vais chercher un peu, mais est-ce compatible sous PHP 4.x ? Et si tu connais un site sympa sur le sujet, les liens sont bienvenu, merci beaucoup =) !

Bon je suis depuis ce matin sur ce ****** de script, j’arrive à créer l’item, mais pas au bon endroit :@ ! Voici mes codes :

<?php

$dom = new DomDocument();
$dom->load("test.xml");

$item = $dom->createElement("item");
$title = $dom->createElement("title");
$titletext = $dom->createTextNode("XML in PHP5");

$title->appendChild($titletext);
$item->appendChild($title);
$dom->documentElement->appendChild($item);

print $dom->saveXML();

?>

Et le code qu’il me retourne lorsque j’éxcecute :

<?xml version="1.0" encoding="ISO-8859-1"?>
<rss version="2.0">
    <channel>
   
        <title>WarZone.fr</title>
        <link>http://warzone.fr</link>
        <description>WARZONE.FR, Toute l'actualité au quotidien sur les MMO, MMORPG, CORPG.</description>
        <copyright>© MonSite 2005</copyright>
        <language>fr</language>

       
    </channel>
<item><title>XML in PHP5</title></item></rss>

En gros faut que j’arrive à l’incorporer dans channel, mais je vois pas comment =X ! J’ai trop de mal et ne connaissant pas trop la syntaxe pour manipuler des objets, tous mes tests se retrouvent bourrés de Warnig ou Fatal Error -_- !

De deux, il m’enregistre pas réellement dans mon fichier test.xml, pk? =X

Yahou j’ai réussi à faire ce que je voulais comme ça :

<?php

$dom = new DomDocument();
$dom->load("test.xml");

$item = $dom->createElement("item");
$title = $dom->createElement("title");
$titletext = $dom->createTextNode("XML in PHP5");
$description = $dom->createElement("description");
$descriptiontext = $dom->createTextNode("texteuh : XML in PHP5!");

$title->appendChild($titletext);
$item->appendChild($title);
$description->appendChild($descriptiontext);
$item->appendChild($description);
$a = $dom->getElementsByTagName("channel")->item(0);
$a->appendChild($item);

$dom->save('test.xml');

?>

Reste un dernier problème, comment faire pour que les Items ajoutés se retrouve en premier et non en dernier ?

http://fr2.php.net/manual/fr/function.domn…sert-before.php

J’arrive pas à l’utiliser :s!

Car je dois dire quel item je dois précéder, et comme pour le RSS c’est tous des item je vois pas comment les différencier…

Actuellement je me retrouve avec ceci qui ne marche biensure pas :

<?php

$dom = new DomDocument();
$dom->validateOnParse = true;
$dom->load("test.xml");

$item = $dom->createElement("item");
$title = $dom->createElement("title");
$titletext = $dom->createTextNode("XML in PHP5");
$description = $dom->createElement("description");
$descriptiontext = $dom->createTextNode("texteuh : XML in PHP5!2");

$title->appendChild($titletext);
$item->appendChild($title);
$description->appendChild($descriptiontext);
$item->appendChild($description);
$a = $dom->getElementsByTagName("channel");
$b = $dom->getElementsByTagName("item");

var_dump($b);
$a->insert_before($item,$b);

$dom->save('test.xml');

?>

Qui retourne :

Merci de bien vouloir m’aider =D !

As-tu essayé de d’utiliser insertBefore() à la place de insert_before() ?

Oui j’ai essayé, et ça me retourne ça :

Je réctifie, ce code paraît logique qu’il ne fonctionne pas, car dans la deuxième variable de insert_before j’ai pas mis un mais plusieurs objets… Or il faut simplement l’objet que l’on veux précédé. J’ai essayé avec le code suivant :

<?php

$dom = new DomDocument();
$dom->validateOnParse = true;
$dom->load("test.xml");

$item = $dom->createElement("item");
$title = $dom->createElement("title");
$titletext = $dom->createTextNode("XML in PHP5");
$description = $dom->createElement("description");
$descriptiontext = $dom->createTextNode("texteuh : XML in PHP5!2");

$title->appendChild($titletext);
$item->appendChild($title);
$description->appendChild($descriptiontext);
$item->appendChild($description);
$a = $dom->getElementsByTagName("channel");
$b = $a->firstchild();

var_dump($b);
$a->insertbefore($item,$b);

$dom->save('test.xml');

?>

Celui-ci me retourne :

Pourquoi $a est-il un DOMNodeList ? N’est-ce pas censé être un DomNode (il me semble qu’il n’y a qu’un <channel> ?

En vrai j’ai pas pigé les DomNode donc c’est suremnt pour ça que ça marche pas, comment puis-je passer mon $a en DomNode?

Attention hein, avec DOM XML et DOM !

C’est DOM qu’il te faut

http://fr.php.net/manual/fr/ref.dom.php

$dom->validateOnParse = true; // à éviter, c’est pour valider le document selon la DTD…

Ok mais ça résoud pas mon prob’ ça ^o) ?

Oui il n’y a qu’un Channel, donc normalement c’est un objet et pas un list :confused: !

[Mode Déséspéré : On]
Pfiouh c’est une question conne non? C’est pas bien compliqué, à croire que personne n’utilise de classe et de DOM :confused: ! Moi perso ça me surpasse un peu, je connais pas trop la syntaxe, mais SVP aidez moi j’en ai besoin rapidement de ce script :frowning: !
[Mode Déséspéré : Off]

Et : $b = $a->item(0)->firstChild;

La majuscule importe normalement…

Et surtout c’est une propriété (cf. doc mal foutue)… donc $a->firstChild.

Sinon en DOM :

NodeList getElementByTagName(String);

Toujours une erreur :confused: !
J’ai essayer ce code :

<?php

$dom = new DomDocument();
$dom->load("test.xml");

$item = $dom->createElement("item");
$title = $dom->createElement("title");
$titletext = $dom->createTextNode("XML in PHP5");
$description = $dom->createElement("description");
$descriptiontext = $dom->createTextNode("texteuh : XML in PHP5!2");

$title->appendChild($titletext);
$item->appendChild($title);
$description->appendChild($descriptiontext);
$item->appendChild($description);
$a = $dom->getElementsByTagName("channel");
$b = $a->item(0)->firstChild;

var_dump($a);
$a->insert_before($item,$b);

$dom->save('test.xml');

?>

Et ça me retourne :

J’ai essayé avec la syntaxe insertBefore mais même erreur :confused: .

Merci à toi de m’aider Sans-Nom =) !

Quand tu liras tes trucs de debug, et que tu liras en parallèle la doc, ça ira mieux hein :

object(DOMNodeList)#7 (0) { }
Fatal error: Call to undefined method DOMNodeList::insert_before() in /home.10.2/lifemmor/www/test2.php5 on line 20

La seule méthode de NodeList, c’est :

http://fr.php.net/manual/fr/function.dom-d…delist-item.php

insertBefore, c’est spécifique à DOMNode :

http://fr.php.net/manual/fr/function.dom-d…nsertbefore.php

Tente :

$a->item(0)->insertBefore($item, $b);

Et RTFM pour le reste :slight_smile:

Ok la prochaine fois je RTFM :confused: !

Là mon code marche, m’enfin je trouve pas ça très logique, surtout ce passage :

$a = $dom->getElementsByTagName("channel");  

$b = $a->item(0)->firstChild;
$a->item(0)->insertBefore($item, $b);

En "traduction" :

Je vois pas clairement l’interêt de item(0) même s’il ets indispensable au fonctionnement de ce code :confused: !
Pourtant j’ai lu le fucking manuel :confused: