HTML -> XML -> RSS : DOM

Petit nouveau ! | 4 Messages

29 oct. 2007, 12:33

Bonjour,

Après avoir recherché le moyen le plus simple d'arriver à générer un flux RSS, j'en suis arrivé à la conclusion que l'utilisation des fonctions DOM de PHP était la meilleure voie !

Je cherche donc à générer une flux RSS à partir d'un fichier HTML structuré en tableaux, j'ai pas mal avancé mais je bute encore sur quelques points :

Mon fichier HTML est modélisé de la sorte (je ne poste pas l'entête ni le CSS):

Code : Tout sélectionner

<table> <tbody><tr align="center"> <td colspan="2" class="mois">Octobre</td> </tr> <tr> <td colspan="2" class="jour">Mardi 23 Octobre</td> </tr> <tr class="nmr1"> <td align="center" valign="top" width="60"> <a href="http://monlien1.com" class="objet"> <b>007</b> </a> </td> <td> <a href="http://monlien1.com class="objet"> Description de l'objet 007 </a> </td> </tr> etc...
Je souhaiterais que mon flux RSS soit de la sorte :

Code : Tout sélectionner

<?xml version="1.0" encoding="iso-8859-1"?><rss version="2.0"> <channel> <title>Flux des objets</title> <description>Flux RSS des objets</description> <lastBuildDate>Wed, 27 Jul 2005 00:30:30 -0700</lastBuildDate> <link>http://localhost/script.html</link> <item> <title>007 - Description de l'objet 007</title> <description>Description de l'objet 007</description> <pubDate>Tue, 23 Oct 2007 00:30:30 -0700</pubDate> <link>http://monlien1.com</link> </item> (etc...) </channel> </rss> </xml>
Pour l'instant, j'ai codé ceci :

Code : Tout sélectionner

<?php $ressource="http://localhost/script.html"; $doc = new DOMDocument(); $doc->loadHTMLFile($ressource); if ($doc) { echo "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><rss version=\"2.0\">\n"; echo "<channel>\n"; echo "<title>Flux des objets</title>\n"; echo "<description>Flux RSS des objets</description>\n"; echo "<lastBuildDate>Wed, 27 Jul 2005 00:30:30 -0700</lastBuildDate>\n"; echo "<link>".$ressource."</link>\n"; $name = $doc->getElementsByTagName('a'); foreach ($name as $tag) { echo "<item>\n"; echo "<title>".$tag->nodeValue."-</title>\n"; echo "<description></description>\n"; echo "<pubDate>Mon, 25 Jul 2005 00:30:30 -0700</pubDate>\n"; echo "<link>"; echo $tag->getAttribute("href"); echo "</link>\n"; echo "</item>\n"; } } echo "</channel>\n"; echo "</rss>\n"; echo "</xml>\n"; ?>
Mes problèmes sont :

- pour l'instant, j'extraie chaque élément du tableau à l'aide de la fonction getElementsByTagName('a'); car je n'arrive pas à identifier la fonction PHP suffisamment précise pour m'identifier le <tr class="nmr1">. Identifier tr, OK, mais comment préciser uniquement les tags tr donc le class est nmr1 ?
- ensuite, est-il possible d'identifier un champ par rapport à un autre : par exemple, une fois que j'ai identifié les lignes de mon tableau dont le class est nmr1, est-il possible de "descendre" dans l'arborescence XML pour trouver la description, le lien ?

J'espère avoir été clair ! Merci d'avance pour vos réponses.

N.B. : j'ai beaucoup cherché sur Google, a priori il n'y a pas beaucoup de gens qui utilisent les DOM dans ce cas précis, car la plupart du temps les RSS sont générés à partir d'une BDD locale, et non extraite d'un fichier HTML.[/code]

Mammouth du PHP | 2937 Messages

29 oct. 2007, 16:04

Pour accéder à l'attribut class de ton tr, essaie la méthode getAttribute () :
$doc -> getElementsbyTagName ('tr') -> getAttribute ('class');

Petit nouveau ! | 4 Messages

30 oct. 2007, 12:35

Merci pour ta réponse Victor. En rentrant la ligne que tu proposes :

<code>
$name = $doc -> getElementsbyTagName('tr') -> getAttribute('class');
</code>

J'obtiens l'erreur suivante :

<code>
Call to undefined method DOMNodeList::getAttribute()
</code>

Etrange !

Mammouth du PHP | 2937 Messages

30 oct. 2007, 13:17

Essaie cela :
<?php
foreach ($doc -> getElementsByTagName ('tr') as $tr)
{
  foreach ($tr -> childNodes as $child)
  {
    echo $child -> getAttribute ('class');
  }
}
?>

Petit nouveau ! | 4 Messages

30 oct. 2007, 14:58

Rebonjour Victor,

Merci à nouveau pour ta réponse.

j'ai donc dans mon code :

foreach ($doc -> getElementsByTagName ('tr') as $tr)
{
  foreach ($tr -> childNodes as $child)
  {
    echo $child -> getAttribute ('class');
    echo "</link>\n";
    echo "</item>\n";

  }
}

J'obtiens toujours un <b>Fatal error</b>: Call to undefined method DOMText::getAttribute() in <b>/var/www/xml.php</b> on line <b>21</b><br />, ligne qui correspond au getAttribute.
Y aurait-il quelque chose de spécifique à déclarer dans mon php.ini pour qu'il accepte le getAttribute ? Pourtant j'ai bien le XML Support "active", XMLReader 'enabled' et XMLWriter "enabled".

Merci d'avance,

Mammouth du PHP | 2937 Messages

30 oct. 2007, 15:13

Pourtant j'ai bien le XML Support "active", XMLReader 'enabled' et XMLWriter "enabled".
Et l'extension DOM XML ?

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

30 oct. 2007, 15:21

@daniel24
Les balises de mise en page s'utilisent avec des [] et non <> :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Invité
Invité n'ayant pas de compte PHPfrance

30 oct. 2007, 15:47

@daniel24
Les balises de mise en page s'utilisent avec des [] et non <> :wink:
Merci, j'ai codé correctement mes codes, les <b> qui passent sont simplement les retours de php dans le source des pages XML qui me sont retournées.

Invité
Invité n'ayant pas de compte PHPfrance

30 oct. 2007, 15:48

Pourtant j'ai bien le XML Support "active", XMLReader 'enabled' et XMLWriter "enabled".
Et l'extension DOM XML ?
Merci de ta réponse.

Je suis en PHP5. A priori, il n'y a plus d'extension DOM XML à rajouter, l'extension DOM est comprise d'office dans PHP5. D'ailleurs, les autres commandes DOM passent sans problème, c'est étrange.

http://alexandre.alapetite.net/doc-alex ... ex.en.html

Eléphant du PHP | 443 Messages

30 oct. 2007, 16:01

Salut,

Si ta page HTML de départ est un document XML Valide (à priori c'est le ça sinon tu ne pourrais pas la charger via DOM), fais plutot la conversion en utilisant XSL.


Tracker.

Petit nouveau ! | 4 Messages

30 oct. 2007, 16:41

Bonjour Tracker,
Salut,
Si ta page HTML de départ est un document XML Valide (à priori c'est le ça sinon tu ne pourrais pas la charger via DOM), fais plutot la conversion en utilisant XSL.
La page HTML est une page distante générée a priori a partir d'une BDD. Donc je pense que c'est un document XML valide, et je n'ai pas d'erreur lors du chargement via DOM.

As-tu quelques références ou exemples qui me permettrait d'utiliser XSL pour passer d'HTML vers mon flux RSS ?

Merci d'avance,

Eléphant du PHP | 443 Messages

30 oct. 2007, 17:04

Non désolé, mais hormis la transformation des dates ça parrait réalisable assez simplement.


Tracker.