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

Bibliothèques et frameworks PHP Discussion :

[DOM] Boucle sur les titres hi d'un document xhtml


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre confirmé
    Homme Profil pro
    conception et traitement de documents xhtml
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : conception et traitement de documents xhtml
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Par défaut [DOM] Boucle sur les titres hi d'un document xhtml
    Bonjour,

    Comment puis-je définir en DOM ou DOM + Xpath une boucle prenant en compte tous les titres h1, h2, h3... d'un document xhtml dans l'ordre dans lequel ils sont placés, indépendamment de leur hiérarchie ? (Par exemple h1, h2, h3, h3, h3, h2, h3, h3, h1...)


    Grand merci d'avance

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 359
    Billets dans le blog
    17
    Par défaut
    Fais un XPath :

    //h1|//h2|//h3|//h4|//h5|//h6

  3. #3
    Membre confirmé
    Homme Profil pro
    conception et traitement de documents xhtml
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : conception et traitement de documents xhtml
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Par défaut
    Merci Séb pour ta réponse.

    Effectivement, c'est la solution la plus simple, compte tenu du faible nombre de niveaux de titre prévus (je n'utilise jamais plus de 5 niveaux).

  4. #4
    Membre confirmé
    Homme Profil pro
    conception et traitement de documents xhtml
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : conception et traitement de documents xhtml
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Par défaut
    Bonjour,

    Petite difficulté cependant :

    Si j'effectue la recherche sur tout le document,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $query = "//h1|//h2|//h3|//h4|//h5";
    titles = $doc_xpath -> query($query);
    je récupère bien tous les titres.

    Si par contre, j'effectue la recherche sur une div contenant le document principal,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $query = "div[@id = 'Document']//h1|//h2|//h3|//h4|//h5";
    $titles = $doc_xpath -> query($query);
    j'obtiens les titres à partir seulement de h2.

    Comment dois-je libeller $query pour que tous les titres de la div soient vus ?

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    div[@id = 'Document']//*[self::h1|self::h2|self::h3|self::h4|self::h5|self::h6]

  6. #6
    Membre confirmé
    Homme Profil pro
    conception et traitement de documents xhtml
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : conception et traitement de documents xhtml
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Par défaut
    Merci Stealth

    J'ai toujours grand plaisir à voir répondre le Maître !

    Malheureusement la solution que tu proposes ne semble pas fonctionner : aucun titre n'est sélectionné.

    Il semble que c'est la transition div[@id = 'Document']//* (et plus généralement div[@id = 'Document']//quelque chose) qui pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = "div[@id = 'Document']//*";
    ne sélectionne aucun noeud.

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    montre la source

  8. #8
    Membre confirmé
    Homme Profil pro
    conception et traitement de documents xhtml
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : conception et traitement de documents xhtml
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Par défaut
    Il n'y a a priori pas de code particulier.

    La partie principale (div "Document") est structurée à l'aide de div "Section" imbriquées, chaque section correspondant à un niveau de titre (je reproduis ci-dessous cette structure en me limitant au niveau 2) :
    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
    23
    24
    25
    26
    <body>
    	<div id="Document>
    		<div class="Section">
    			<h1>Titre de niveau 1</h1>
    			<div class="Section">
    				<h2>Titre de niveau 2</h2>
    				Texte
    			</div>
    			<div class="Section">
    				<h2>Titre de niveau 2</h2>
    				Texte
    			</div>
    		</div>
    		<div class="Section">
    			<h1>Titre de niveau 1</h1>
    			<div class="Section">
    				<h2>Titre de niveau 2</h2>
    				Texte
    			</div>
    			<div class="Section">
    				<h2>Titre de niveau 2</h2>
    				Texte
    			</div>
    		</div>
    	</div>
    </body>
    Important : Cette structure en div imbriquées est celle que je préconise pour mes utilisateurs car elle permet de mieux visualiser l'organisation du document à l'écran. Les utilisateurs peuvent s'ils le désirent écrire leur documentation sans définir de structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <h1>Titre de niveau 1</h1>
    Texte
    <h2>Titre de niveau 2</h2>
    Texte
    <h2>Titre de niveau 2</h2>
    Texte
    <h1>Titre de niveau 1</h1>
    Texte
    ou mixer les deux approches (certaines parties structurées à l'aide de div "Section", d'autres écrites directement).

    Le code d'essai est basique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $query = "div[@id = 'Document']//*";
    $titles = $doc_xpath -> query($query);
    foreach($titles as $title)
    	{echo $title -> nodeName . " " . $title -> nodeValue . "\n";}
    Mais rien n'est affiché !

  9. #9
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    faut mettre // devant ton div

  10. #10
    Membre confirmé
    Homme Profil pro
    conception et traitement de documents xhtml
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : conception et traitement de documents xhtml
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Par défaut
    Merci Stealth !

    Ça marche parfaitement avec le code que tu m'as indiqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = "//div[@id = 'Document']//*[self::h1|self::h2|self::h3|self::h4|self::h5|self::h6]";
    J'obtiens bien tous les titres de la div "Document"

    Je commence à avoir les réflexes DOM (après un apprentissage quelque peu difficile ) mais je n'ai pas encore les réflexes Xpath.

    Merci encore


    PS : Le code proposé par Séb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = "//div[@id = 'Document']//h1|//h2|//h3|//h4|//h5|//h6";
    fonctionne tout aussi bien. Merci Séb !

  11. #11
    Membre confirmé
    Homme Profil pro
    conception et traitement de documents xhtml
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : conception et traitement de documents xhtml
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Par défaut
    Citation Envoyé par Doc_xhtml Voir le message
    PS : Le code proposé par Séb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = "//div[@id = 'Document']//h1|//h2|//h3|//h4|//h5|//h6";
    fonctionne tout aussi bien. Merci Séb !
    Petit bémol cependant : Le code de Séb prend aussi en compte les titres 2, 3... (mais pas les titres 1 !?) de la div "Annexes" qui suit la div "Document", alors que le code de Stealth limite la recherche à la seule div "Document", ce qui est bien l'objectif recherché.

    Pourquoi ce comportement du code de Séb ?

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par Doc_xhtml Voir le message
    Petit bémol cependant : Le code de Séb prend aussi en compte les titres 2, 3... (mais pas les titres 1 !?) de la div "Annexes" qui suit la div "Document", alors que le code de Stealth limite la recherche à la seule div "Document", ce qui est bien l'objectif recherché.

    Pourquoi ce comportement du code de Séb ?
    parce que le "ou" est mal delimité

  13. #13
    Membre confirmé
    Homme Profil pro
    conception et traitement de documents xhtml
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : conception et traitement de documents xhtml
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Par défaut
    Comment l'approche de Séb doit-elle donc être libellée ?

  14. #14
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par Doc_xhtml Voir le message
    Comment l'approche de Séb doit-elle donc être libellée ?
    elle est correct, c'est juste ce que t'as rajouté qui est faux, puisque tu rajoutes un OU

    du coup ça donne
    (//div[@id = 'Document']//h1) OU //h2 OU //h3 OU //h4 OU //h5 OU //h6

  15. #15
    Membre confirmé
    Homme Profil pro
    conception et traitement de documents xhtml
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : conception et traitement de documents xhtml
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Par défaut
    Malgré quelques essais, je ne trouve pas la bonne façon de transcrire l'approche de Séb.

    Comment faut-il libeller l'instruction $query ?

  16. #16
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par Doc_xhtml Voir le message
    Malgré quelques essais, je ne trouve pas la bonne façon de transcrire l'approche de Séb.

    Comment faut-il libeller l'instruction $query ?
    la bonne méthode pour ta requete est la mienne, je vois pas pourquoi tu veux faire autrement
    et t'es pas obligé de faire un xpath une boucle avec un getElementsByTagname suffit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $tags = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6');
    $heads = array();
     
    foreach ($tags as $tag) {
        $heads = array_merge($heads, iterator_to_array($doc->getElementsByTagName($tag)));
    }

  17. #17
    Membre confirmé
    Homme Profil pro
    conception et traitement de documents xhtml
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : conception et traitement de documents xhtml
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    la bonne méthode pour ta requete est la mienne, je vois pas pourquoi tu veux faire autrement
    et t'es pas obligé de faire un xpath une boucle avec un getElementsByTagname suffit
    Je sais que la bonne méthode est la tienne puisqu'elle fonctionne nickel.
    Je voulais par curiosité essayer de faire marcher les deux méthodes.

    Quand à la boucle, je préfère utiliser la logique Xpath qui me semble conceptuellement plus élégante. (Par ailleurs, la fonction de traitement en aval de la recherche est basée sur une logique de nodeList et a pour argument la liste des titres trouvés.)


    Petite question complémentaire :
    Dans la mesure où une recherche par Xpath contient une ou plusieurs boucles implicites, qu'est-ce qui est le plus rapide : une recherche par Xpath ou une recherche "plus basique" par une boucle DOM ?

  18. #18
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par Doc_xhtml Voir le message
    Petite question complémentaire :
    Dans la mesure où une recherche par Xpath contient une ou plusieurs boucles implicites, qu'est-ce qui est le plus rapide : une recherche par Xpath ou une recherche "plus basique" par une boucle DOM ?
    je connais pas les sources de Libxml2, donc je passe mon tour, fait un petit bench tu seras fixé

  19. #19
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 359
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 359
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Doc_xhtml Voir le message
    Malgré quelques essais, je ne trouve pas la bonne façon de transcrire l'approche de Séb.
    L'approche est la même, il n'y a pas de bonne et mauvaise méthode. C'est juste qu'au début tu disais "tous les titres h1, h2, h3... d'un document xhtml", ensuite tu as rajouté "recherche sur une div contenant le document principal"

  20. #20
    Membre confirmé
    Homme Profil pro
    conception et traitement de documents xhtml
    Inscrit en
    Août 2011
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : conception et traitement de documents xhtml
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 107
    Par défaut
    Effectivement, je pensais naïvement que la recherche dans un document xhtml et celle dans une div procèdent de la même logique.

    D'où, comme tu le soulignes, la nécessité de bien formuler ses questions.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. boucle sur les répertoires
    Par salseropom dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 15/06/2007, 02h59
  2. boucle sur les champs dynamiques
    Par Anduriel dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 17/06/2006, 20h49
  3. [C#] Boucle sur les controles
    Par stailer dans le forum Windows Forms
    Réponses: 3
    Dernier message: 10/05/2006, 09h48
  4. Macro sur Excel/Boucle sur les lettres
    Par life is magic dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 25/11/2005, 12h56

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