IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

DOMXPath et DOMNodeList.


Sujet :

Langage PHP

  1. #1
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut DOMXPath et DOMNodeList.
    Yo!! Bonjour

    J'ai un doc html qui se présente comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <html xml:lang="el" xmlns="http://www.w3.org/1999/xhtml"> 
    <head><title>Titre</title> 
    <link rel="stylesheet" type="text/css" href="style.css"/> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    </head> 
    <body> 
         <div align="center"> 
             <p>&nbsp;</p> 
     
    	   <p align="center"><strong>Titre</strong></p>
    	   <p align="center">Ν. Auteur<br />
    	   </p>
    	   <p align="center">&nbsp;</p>
    	   <table width="748"> 
          <tbody> 
    	  <tr>  
            <td width="740"><p align="justify">
    blablabla
    	</p></tbody></table> 
    </div> 
     
    </body></html>
    Maintenant, pour récupérer les éléments blablabla qui se trouvent dans la balise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <p align="justify">
    </p>
    Je fais ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $data = file_get_contents('MonDoc.html');
    if ($data === false) {
       exit;
    }
    $dom = new DOMDocument();
    $dom->loadHTML($data);
    $xpath = new DOMXPath($dom);
    $nodes = $xpath->query('p[@align="justify"]');
    foreach($nodes as $node) {
       $txt = $node->textContent;
    }
    Mais je ne comprends pas pourquoi ca ne remonte rien.??

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $nodes = $xpath->query('p[@align="justify"]');
    N'oublie pas l'accesseur. Là tu cherches parmi les <p> présents dans le noeud courant.
    Pour chercher parmi tous les <p> du document : //p[...



    Astuce : tu peux charger un fichier avec DOMDocument::load( ) et ainsi éviter file_get_contents( ).
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    ok merci pour la réponse. j'ai compris.
    On peut aussi utiliser ceci:
    ($nodes->Item(0)->childNodes->Item(0)->childNodes->Item(0)->childNodes->Item(0)->childNodes);

    Autre chose:
    Supposons que j'ai le texte html suivant, avec des balises hmtl de mises en forme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <table width="748"> 
          <tbody> 
    	  <tr>  
          <td width="740"><p>«&nbsp;C’est  à tort que les hommes se lamentent<br />
            sur la fuite du temps,<br />
            l’accusant d’être trop rapide, <br />
            sans s’apercevoir que sa durée est suffisante&nbsp;;<br />
            mais la bonne mémoire <br />
            dont la nature nous a dotés, <br />
            fait que les choses depuis longtemps passées<br />
            nous semblent présentes.&nbsp;»</p>
    [....]
    ne peut être vaincue si facilement.<br />
    Construite sur l’œuvre des génies,<br />
    elle ne tremble nullement<br />
    face à la bêtise et la méchanceté.<br />
    Elle continue à combattre le néant<br />
    afin que l’univers des hommes survive.</td></tr> 
      </tbody></table>
    Pour récupérer le texte à l'intérieur, j'ai fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $nodes = $dom->getElementsByTagName("table");
    htmlentities($nodes->Item(1)->childNodes->Item(0)->childNodes->Item(0)->childNodes->Item(0)->nodeValue,ENT_NOQUOTES, 'UTF-8')
    Mais le problème est qu'on ne récupère pas les balises de mises en forme, elles sont interprétées pour certaines, et pour d'autres, elles ne sont pas prises en compte.

    Comment puis-je faire?

    merci

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 101
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 101
    Points : 8 211
    Points
    8 211
    Billets dans le blog
    17
    Par défaut
    Comment puis-je faire?
    Que veux-tu faire exactement ?
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  5. #5
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    j'ai trouvé exactement ce que je cherchais sur internet:

    function DOMinnerHTML($element)
    {
    $innerHTML = "";
    $children = $element->childNodes;
    foreach ($children as $child)
    {
    $tmp_dom = new DOMDocument();
    $tmp_dom->appendChild($tmp_dom->importNode($child, true));
    $innerHTML.=trim($tmp_dom->saveHTML());
    }
    return $innerHTML;
    }

    maintenant, je voudrais savoir si en php il y a une fonction équivalent au On error resume next du vba:

    foreach($file in $files)
    {
    //si ca plante, passe à l'autre fichier.

    }

    merci

Discussions similaires

  1. DOMXPath : récupérer un aîeul
    Par krunch dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 20/02/2013, 00h29
  2. [VB6] [XML][DOM] Collection DOMNodeList vide
    Par Ykh'Drazhir dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 04/01/2005, 14h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo