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 21/11/2011, 13h37   #1
Membre du Club
 
Homme Boris
conception et traitement de documents xhtml
Inscription : août 2011
Messages : 107
Détails du profil
Informations personnelles :
Nom : Homme Boris
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
Points : 59
Points : 59
Par défaut 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
Doc_xhtml est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/11/2011, 18h42   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 454
Points : 3 454
Fais un XPath :

//h1|//h2|//h3|//h4|//h5|//h6
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/11/2011, 19h46   #3
Membre du Club
 
Homme Boris
conception et traitement de documents xhtml
Inscription : août 2011
Messages : 107
Détails du profil
Informations personnelles :
Nom : Homme Boris
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
Points : 59
Points : 59
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).
Doc_xhtml est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 02h02   #4
Membre du Club
 
Homme Boris
conception et traitement de documents xhtml
Inscription : août 2011
Messages : 107
Détails du profil
Informations personnelles :
Nom : Homme Boris
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
Points : 59
Points : 59
Bonjour,

Petite difficulté cependant :

Si j'effectue la recherche sur tout le document,
Code :
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 :
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 ?
Doc_xhtml est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 10h04   #5
Modérateur
 
Inscription : septembre 2010
Messages : 7 139
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 139
Points : 8 505
Points : 8 505
comme ça

Code :
div[@id = 'Document']//*[self::h1|self::h2|self::h3|self::h4|self::h5|self::h6]
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 12h20   #6
Membre du Club
 
Homme Boris
conception et traitement de documents xhtml
Inscription : août 2011
Messages : 107
Détails du profil
Informations personnelles :
Nom : Homme Boris
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
Points : 59
Points : 59
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 :
$query = "div[@id = 'Document']//*";
ne sélectionne aucun noeud.
Doc_xhtml est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 14h14   #7
Modérateur
 
Inscription : septembre 2010
Messages : 7 139
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 139
Points : 8 505
Points : 8 505
montre la source
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 15h14   #8
Membre du Club
 
Homme Boris
conception et traitement de documents xhtml
Inscription : août 2011
Messages : 107
Détails du profil
Informations personnelles :
Nom : Homme Boris
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
Points : 59
Points : 59
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 :
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 :
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 :
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é !
Doc_xhtml est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 15h25   #9
Modérateur
 
Inscription : septembre 2010
Messages : 7 139
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 139
Points : 8 505
Points : 8 505
faut mettre // devant ton div
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 15h47   #10
Membre du Club
 
Homme Boris
conception et traitement de documents xhtml
Inscription : août 2011
Messages : 107
Détails du profil
Informations personnelles :
Nom : Homme Boris
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
Points : 59
Points : 59
Merci Stealth !

Ça marche parfaitement avec le code que tu m'as indiqué :
Code :
$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 :
$query = "//div[@id = 'Document']//h1|//h2|//h3|//h4|//h5|//h6";
fonctionne tout aussi bien. Merci Séb !
Doc_xhtml est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 16h41   #11
Membre du Club
 
Homme Boris
conception et traitement de documents xhtml
Inscription : août 2011
Messages : 107
Détails du profil
Informations personnelles :
Nom : Homme Boris
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
Points : 59
Points : 59
Citation:
Envoyé par Doc_xhtml Voir le message
PS : Le code proposé par Séb
Code :
$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 ?
Doc_xhtml est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 16h45   #12
Modérateur
 
Inscription : septembre 2010
Messages : 7 139
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 139
Points : 8 505
Points : 8 505
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é
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 16h48   #13
Membre du Club
 
Homme Boris
conception et traitement de documents xhtml
Inscription : août 2011
Messages : 107
Détails du profil
Informations personnelles :
Nom : Homme Boris
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
Points : 59
Points : 59
Comment l'approche de Séb doit-elle donc être libellée ?
Doc_xhtml est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 16h55   #14
Modérateur
 
Inscription : septembre 2010
Messages : 7 139
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 139
Points : 8 505
Points : 8 505
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
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 17h41   #15
Membre du Club
 
Homme Boris
conception et traitement de documents xhtml
Inscription : août 2011
Messages : 107
Détails du profil
Informations personnelles :
Nom : Homme Boris
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
Points : 59
Points : 59
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 ?
Doc_xhtml est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 17h42   #16
Modérateur
 
Inscription : septembre 2010
Messages : 7 139
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 139
Points : 8 505
Points : 8 505
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 :
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)));
}
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 17h59   #17
Membre du Club
 
Homme Boris
conception et traitement de documents xhtml
Inscription : août 2011
Messages : 107
Détails du profil
Informations personnelles :
Nom : Homme Boris
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
Points : 59
Points : 59
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 ?
Doc_xhtml est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 18h04   #18
Modérateur
 
Inscription : septembre 2010
Messages : 7 139
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 139
Points : 8 505
Points : 8 505
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é
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 19h50   #19
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 823
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 823
Points : 3 454
Points : 3 454
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"
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/11/2011, 21h54   #20
Membre du Club
 
Homme Boris
conception et traitement de documents xhtml
Inscription : août 2011
Messages : 107
Détails du profil
Informations personnelles :
Nom : Homme Boris
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
Points : 59
Points : 59
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.
Doc_xhtml 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 10h51.


 
 
 
 
Partenaires

Hébergement Web