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 13/10/2011, 12h27   #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 Trouver un élément donné en aval ou en amont du noeud courant

Rebonjour,

Autre point que je devrai résoudre : comment trouver le premier élément doté d'une classe donnée en aval du noeud courant, mais pas forcément au même niveau que lui, ou comment trouver le premier élément doté de cette classe en amont du noeud courant ?

Si j'ai bien compris, nextSibling et previousSibling permettent de parcourir les noeuds situés au même niveau de DOM.

Mais si l'élément recherché ne se trouve pas au même niveau que le noeud courant ?

Typiquement : le noeud courant est un item de liste <li>, alors que l'élément recherché se trouve quelque-part avant ou quelque-part après la la liste <ul>.


Merci de votre aide
Doc_xhtml est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2011, 15h21   #2
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,

Je crains que le début de mon post n'était pas vraiment clair.

Concrètement :

J'ai des balises <p> ou <span> dont l'attribut class est égal à "Remplacement".
Code :
1
2
3
<p class="Remplacement">Infos</p>
ou
<span class="Remplacement">Infos</span>
Ces balises sont repérées puis traitées une à une par le code suivant :
Code :
1
2
3
4
5
6
7
8
$text_area_xpath = new DOMXPath($text_area_xhtml);
 
$remplacements = $text_area_xpath -> query(sprintf("//*[contains(concat(' ', normalize-space(@class), ' '), ' %s ')]", 'Remplacement'));
 
foreach($remplacements as $remplacement)
{
   traitement de la balise courante
}
Il me faut trouver la div Module située après la balise Remplacement courante:
Code :
1
2
3
4
5
<p class='Remplacement'>Infos</p>
[...]
<div class="Module">
   contenu de la div
</div>

Pour cela, j'essaie le code suivant :
Code :
1
2
3
4
$query = 'following::div[@class="Module"]';
$modules = $text_area_xpath -> query($query);
$module = $modules -> item(0);
echo $module -> saveHtml();
mais je me récupère le message
Citation:
« Fatal error: Call to a member function saveHtml() on a non-object ».
Quelle est ici la nature de $module (si mon code est bon) et comment connaître le contenu de la div "Module" en html ?

Merci d'avance pour votre aide
Doc_xhtml est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2011, 23h35   #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
Par défaut Comment établir des ponts entre DomDocument et DomXPath ?

En fait, le problème se pose autrement :

La recherche
Code :
$remplacements = $text_area_xpath -> query(sprintf("//*[contains(concat(' ', normalize-space(@class), ' '), ' %s ')]", 'Remplacement'));
réalisée par XPath génère une nodeList DOM qu'on peut ensuite traiter noeud par noeud
Code :
1
2
3
4
foreach($remplacements as $remplacement)
{
   traitement du noeud courant
}
indépendamment de Xpath qui a fait le travail demandé (rechercher les noeuds correspondant aux critères) et qui ne sait a priori pas quel noeud est traité.

Comment peut-on établir un pont entre le traitement par foreach des noeuds générés par query et XPath ?

En d'autres termes, comment indiquer à XPath le noeud en cours de traitement afin de pouvoir effectuer une recherche par query(<noeud en cours>/following::div[@class='Module']) ?

Il ne semble pas en effet que DOM dispose d'une fonction équivalente à following::
(Je ne peux utiliser nextSibling, car la div recherchée n'est pas forcément au même niveau de l'arbre que le noeud courant.)
Doc_xhtml est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2011, 12h27   #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
J'ai trouvé la technique suivante (si vous avez mieux, je suis preneur) :
  1. Je sauvegarde la valeur de l'attribut class du noeud courant
  2. J'attribue au noeud courant un attribut class de repérage (par exemple 'Noeud_courant').
  3. Je renouvelle le DOMXpath.
  4. Je lance une recherche query avec le prédicat following.
  5. Je prends en compte le premier noeud renvoyé, que je peux traiter selon mes besoins.
  6. Je réattribue la valeur d'origine de l'attribut class du noeud courant.

Code correspondant :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$old_class = $noeud_courant -> getAttribute('class');
 
$noeud_courant -> setAttribute('class', 'Noeud_courant');
 
$text_area_xpath = new DOMXPath($text_area_xhtml);
 
$query = '//*[@class = "Noeud_courant"]/following::div[@class="Module"]';
$modules = $text_area_xpath -> query($query);
 
$module = $modules -> item(0);
 
[traitement du module ]
 
$noeud_courant -> setAttribute('class', $old_class);
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 05h01.


 
 
 
 
Partenaires

Hébergement Web