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 25/11/2011, 15h10   #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 Rechercher toutes les occurrences d'une balise sauf celles contenues dans des div données

Bonjour,

Excusez-moi d'être aussi présent sur ce forum. (Je suis à 100 % sur mon projet PHP DOM et vous sollicite lorsque je bute sur une difficulté, ou lorsque je désire faire part d'une solution trouvée.)


J'ai besoin de parser toutes les occurrences d'une balise xhtml sauf celles qui se trouvent dans des div spécifiques.
Typiquement :
Rechercher les balises <xxx class="Class1"> se trouvant en dehors des div <div class="Class2">.

Un grand merci d'avance !
Doc_xhtml est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2011, 17h18   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 991
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 991
Points : 5 031
Points : 5 031
Il faut utiliser un XPath:
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2011, 17h35   #3
Modérateur
 
Inscription : septembre 2010
Messages : 7 219
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 219
Points : 8 598
Points : 8 598
regarde du coté de ancestor
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2011, 21h14   #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
Citation:
Envoyé par Benjamin Delespierre Voir le message
Il faut utiliser un XPath:
J'avais pensé libeller ma question « Rechercher à l'aide de Xpath les balises <xxx class="Class1"> se trouvant en dehors des div <div class="Class2"> » mais j'ai omis de mentionner XPath car il me semblait aller de soi que ce type de recherche ne pouvait être effectuée précisément qu'à l'aide de cet outil.


Citation:
Envoyé par stealth35 Voir le message
regarde du coté de ancestor
Effectivement, la question revient à écrire : sélectionner les noeuds ayant pour classe "Class1" et dont les ancêtres ne sont pas des noeuds de classe Class2.

Mais comment libeller en syntaxe Xpath "dont les ancêtres ne sont pas des noeuds de classe Class2" ?

Comment insérer cette condition dans une expression comme celle ci-dessous (copyright Stealth) ?
Code :
$markups = $xpath -> query(sprintf("//*[contains(concat(' ', normalize-space(@class), ' '), ' %s ')]", 'Class1'));
Je vais donc tâtonner dans cette direction.
Doc_xhtml est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2011, 10h02   #5
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
Effectivement, la question revient à écrire : sélectionner les noeuds ayant pour classe "Class1" et dont les ancêtres ne sont pas des noeuds de classe Class2.
En fait, la question n'est pas correctement formulée.
Il s'agit plutôt :
« sélectionner les noeuds ayant pour classe "Class1" et dont le parent div immédiat n'est pas un noeud de classe Class2. »

Ce qui donne, en reprenant l'expression Xpath mentionnée dans ma précédente réponse
Code :
$markups = $xpath -> query(sprintf("//*[(contains(concat(' ', normalize-space(@class), ' '), ' %s ')) and (ancestor::div[1][@class != 'Class2'])]", 'Class1'));
Explications :

contains(concat(' ', normalize-space(@class), ' '), ' %s ') signifie « balise dont l'attribut class contient le terme 'Class1'. » Le paramètre %s remplace le libellé Class1 précisé après l'expression analysée de sprintf (voir cette page)

ancestor::div[1][@class != 'Class2'])]", 'Class1' signifie « dont le parent div direct a un attribut class différent de Class2 »
(Si, comme je l'ai initialement fait lors de mes essais, on omet d'indiquer l'indice [1], la recherche trouve toutes les balises class="Class1" indépendamment des div qui les contiennent.
En effet, ancestor::div[@class != 'Class2']) signifie « dont au moins un ancêtre a un attribut class autre que Class2 », ce qui est toujours le cas, à moins d'envelopper tout le document avec des balises <div class="Class2"> imbriquées.)


Remarque : Dans la mesure où le nom de la classe Class1 n'est pas variable, on peut simplifier comme suit l'expression recherchant les balises dont l'attribut class contient le terme Class1
Code :
contains(concat(' ', normalize-space(@class), ' '), ' Class1 ')
ce qui donne finalement
Code :
$markups = $xpath -> query(sprintf("//*[(contains(concat(' ', normalize-space(@class), ' '), ' Class1 ')) and (ancestor::div[1][@class != 'Class2'])]"));

PS : J'ai trouvé sur le liste de MSDN un tutoriel Xpath donnant nettement plus d'explications et d'exemples que celui de W3Shools. C'est en travaillant sur ce tuto que j'ai compris la solution à appliquer à ma question.
Doc_xhtml est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2011, 13h09   #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
Dans la mesure où, dans le cas présent, il n'y a pas besoin de formater la chaîne de recherche, l'expression précédente peut être simplifiée en supprimant l'appel à la fonction sprintf:
Code :
1
2
 
$markups = $xpath -> query("//*[(contains(concat(' ', normalize-space(@class), ' '), ' Class1 ')) and (ancestor::div[1][@class != 'Class2'])]");
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 07h26.


 
 
 
 
Partenaires

Hébergement Web