Page 1 sur 1

HTML -> XML -> RSS : DOM

Posté : 29 oct. 2007, 12:33
par daniel24
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]

Posté : 29 oct. 2007, 16:04
par Victor BRITO
Pour accéder à l'attribut class de ton tr, essaie la méthode getAttribute () :
$doc -> getElementsbyTagName ('tr') -> getAttribute ('class');

Posté : 30 oct. 2007, 12:35
par daniel24
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 !

Posté : 30 oct. 2007, 13:17
par Victor BRITO
Essaie cela :
<?php
foreach ($doc -> getElementsByTagName ('tr') as $tr)
{
  foreach ($tr -> childNodes as $child)
  {
    echo $child -> getAttribute ('class');
  }
}
?>

Posté : 30 oct. 2007, 14:58
par daniel24
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,

Posté : 30 oct. 2007, 15:13
par Victor BRITO
Pourtant j'ai bien le XML Support "active", XMLReader 'enabled' et XMLWriter "enabled".
Et l'extension DOM XML ?

Posté : 30 oct. 2007, 15:21
par Truc
@daniel24
Les balises de mise en page s'utilisent avec des [] et non <> :wink:

Posté : 30 oct. 2007, 15:47
par Invité
@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.

Posté : 30 oct. 2007, 15:48
par Invité
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

Posté : 30 oct. 2007, 16:01
par 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.


Tracker.

Posté : 30 oct. 2007, 16:41
par daniel24
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,

Posté : 30 oct. 2007, 17:04
par Tracker
Non désolé, mais hormis la transformation des dates ça parrait réalisable assez simplement.


Tracker.