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 23/05/2007, 21h17   #1
Rédacteur

 
Avatar de Louis-Guillaume Morand
 
Homme Louis-Guillaume MORAND
Consultant @ Microsoft
Inscription : mars 2003
Messages : 10 713
Détails du profil
Informations personnelles :
Nom : Homme Louis-Guillaume MORAND
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant @ Microsoft
Secteur : Conseil

Informations forums :
Inscription : mars 2003
Messages : 10 713
Points : 15 946
Points : 15 946
Par défaut [DOM] extraire des données d'une page xhtml

Bonjour,

Il existe plein de tutos sur le net pour lire un fichier XML mais ca ne fait jamais ce que je veux, du moins d'une façon absolument pas optimisée et souvent en connaissant la structure du fichier XML.
Ici, j'ai une page XHTML avec une balise speciale disons "toto" qui contient plein d'elements enfants. Mais mon fichier XHTML contient surtout bcp bcp d'informations dont je me contrefiche et dont je ne connais pas la structure.

J'aimerai extraire les données d'une facon plus ou moins equivalente à ce que je ferais avec du JS à savoir
Code :
1
2
3
4
5
node = document.getElementsByTagName('toto')[0];
foreach (node.childNodes)
{
 blabla
}
la partie toto ressemble à ca
Code :
1
2
3
4
<toto>
  <tata name="narf" type="pwet" />
  <tata name="nurf" type="pwout" />
</toto>
c'est donc une serie d'attributs qui m'interessent. Quelle serait la methode la plus simple et optimisée en meme temps pour faire ce que je veux. je ne demande pas un code tout fait mais une piste.

merci d'avance.
__________________
moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom
Louis-Guillaume Morand est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2007, 22h39   #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
Tu as la même chose pour PHP :
Code :
1
2
3
4
5
6
7
8
9
<?php
$dom = DomDocument::load('lgm.xml'); // Voir loadHTML(File)
$node = $dom->getElementsByTagName('toto')->item(0);
foreach ($node->childNodes as $n) {
    if ($n->nodeType == XML_ELEMENT_NODE) {
        printf('%s : %s<br/>', $n->getAttribute('type'), $n->getAttribute('name'));
    }
}
?>
Mais ne serait-ce pas plus simple avec SimpleXML ? Voir avec Expat si les performances sont recherchées et le fichier volumineux (parser de type SAX).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2007, 22h49   #3
Rédacteur

 
Avatar de Louis-Guillaume Morand
 
Homme Louis-Guillaume MORAND
Consultant @ Microsoft
Inscription : mars 2003
Messages : 10 713
Détails du profil
Informations personnelles :
Nom : Homme Louis-Guillaume MORAND
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant @ Microsoft
Secteur : Conseil

Informations forums :
Inscription : mars 2003
Messages : 10 713
Points : 15 946
Points : 15 946
"le peu que tu as donné" manque de bol pour toi, j'ai eu le temps de le voir

Désolé, je pensais que ca suffisait et surtout tu as répondu à ma question à savoir getElementsByTagName() existe en php

ca parait bête mais j'ai jamais eu à coder du DOM coté php donc je n'avais pas connaissance de cette fonction.

par contre je connais sax, je supporte pas son fonctionnement et mon fichier contiendra bcp de data inutiles mais fera rarement plus de 3ko.


Quant à SimpleXML. c'est quoi? ^^
je connais pas mais à première lecture, ce n'est pas plus simple mais pas plus compliqué et p-e plus optimisé. je vais creuser ca. merci julp
__________________
moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom
Louis-Guillaume Morand est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2007, 23h09   #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
SimpleXML pour lire/parcourir un document XML ça devient du gâteau (c'est du DOM en coulisse). SimpleXML et Expat ne seront pas vraiment adaptés pour lire des documents HTML alors que l'extension DOM fournit, lui, des méthodes spécifiques (j'avais oublié cette partie de l'ennoncé lors de mon edit). Pour des fichiers de 3 Ko, tu peux utiliser sans problème DOM ou SimpleXML

En bonus l'équivalent avec SimpleXML pour te montrer:
Code :
1
2
3
4
$sxml = simplexml_load_file('lgm.xml');
foreach ($sxml->toto[0]->tata as $tata) {
    printf('%s : %s<br/>', utf8_decode($tata['type']), utf8_decode($tata['name']));
}
(Ne serais-tu pas en mode furtif ?)
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2007, 21h38   #5
Rédacteur

 
Avatar de Louis-Guillaume Morand
 
Homme Louis-Guillaume MORAND
Consultant @ Microsoft
Inscription : mars 2003
Messages : 10 713
Détails du profil
Informations personnelles :
Nom : Homme Louis-Guillaume MORAND
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant @ Microsoft
Secteur : Conseil

Informations forums :
Inscription : mars 2003
Messages : 10 713
Points : 15 946
Points : 15 946
bon en fait j'ai encore un petit soucis

comment puis-je récupérer l'innerHTML via cette méthode?
Code :
$body = $dom->getElementsByTagName('body')->item(0);
sachant que body =
Citation:
<body>
<table>
<tr>
<td><input type="checkbox" name="coffee" value="cream"></td>
<td>ma tache</td>
<td><img src="_images/edit.gif" /></td>
<td><img src="_images/deleteLink.gif" /></td>
</tr>
<tr>
<td><input type="checkbox" name="coffee" value="cream"></td>
<td>ma tache</td>
<td><img src="_images/edit.gif" /></td>
<td><img src="_images/deleteLink.gif" /></td>
</tr>
</table>
</body>
j'aurais donc besoin de recuperer tous les noeuds enfants de body en tant qu'une chaine de caractere. (et ce, le plus simplement possible, pas envie de tout parser, noeud par noeud)

est-ce possible?
__________________
moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom
Louis-Guillaume Morand est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2007, 23h58   #6
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 ne vois que la méthode saveXML de la classe DomDocument :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$html = <<< HTML
<body>
<table>
<tr>
<td><input type="checkbox" name="coffee" value="cream"></td>
<td>ma tache</td>
<td><img src="_images/edit.gif" /></td>
<td><img src="_images/deleteLink.gif" /></td>
</tr>
<tr>
<td><input type="checkbox" name="coffee" value="cream"></td>
<td>ma tache</td>
<td><img src="_images/edit.gif" /></td>
<td><img src="_images/deleteLink.gif" /></td>
</tr>
</table>
</body>
HTML;
 
$dom = DomDocument::loadHTML($html);
$body = $dom->getElementsByTagName('body')->item(0);
echo $dom->saveXML($body);
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2007, 00h36   #7
Rédacteur

 
Avatar de Louis-Guillaume Morand
 
Homme Louis-Guillaume MORAND
Consultant @ Microsoft
Inscription : mars 2003
Messages : 10 713
Détails du profil
Informations personnelles :
Nom : Homme Louis-Guillaume MORAND
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Consultant @ Microsoft
Secteur : Conseil

Informations forums :
Inscription : mars 2003
Messages : 10 713
Points : 15 946
Points : 15 946

ca fait tout pareil mais en plus propre que mon
Code :
$body = substr($theData, strpos($theData, "<body>"), strpos($theData, "</body>") - strpos($theData, "<body>"));
on se moque pas! :p
__________________
moi c'est Louis-Guillaume, ni Louis, ni Guillaume mais Louis-Guillaume et je n'aide pas ceux qui écorchent mon nom
Louis-Guillaume Morand est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h03.


 
 
 
 
Partenaires

Hébergement Web