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, 12h07   #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 Connaître la structure du contenu d'un noeud html

Bonjour à toutes et à tous,

Comme je l'indiquais dans mon précédent post, j'ai besoin de remplacer soit le contenu du noeud courant, soit le noeud lui-même, en fonction du contenu du noeud de remplacement.

Typiquement:
  • Si le noeud courant est un paragraphe ou un span, et si le contenu du noeud de remplacement est une image, je dois remplacer le contenu du paragraphe ou du span par l'image :
    <p>texte</p> est remplacé par <p><img alt="" src="chemin_image" /></p>
    ou
    <span>texte</span> est remplacé par <span><img alt="" src="chemin_image" /></span>
  • Si le noeud courant est un paragraphe ou un span et si le contenu du noeud de remplacement est un texte (avec éventuellement des balises in-line telles que span, b, a), je dois remplacer le contenu du paragraphe par le texte:
    <p>texte initial</p> est remplacé par <p>texte de remplacement avec ses balises</p>
  • Si le noeud courant est un paragraphe et si le contenu du noeud de remplacement est une structure html quelconque, je dois remplacer le paragraphe par la structure html :
    <p>texte</p> est remplacé par structure html

    Remarque : Il y a dans ce cas une petite difficulté supplémentaire. Dans la mesure où les parties html sont extraites d'items de listes (li ou dd), je peux avoir une structure telle que :
    texte de début de la balise li ou dd
    puis balises html (p, div, ul...)

    Le premier texte doit alors être placé dans un paragraphe.

  • Si le noeud courant est un item de liste li et si le contenu du noeud de remplacement est une liste, je dois remplacer le noeud courant par les items de liste (sans les balises <ul> et </ul>) :
    <li>texte initial</li> est remplacé par
    <li>item de remplacement 1</li>
    <li>item de remplacement 2</li>
    etc

Comment puis-je déterminer la structure du noeud de remplacement afin d'appliquer la règle de remplacement qui convient ?

Merci grandement d'avance pour votre aide.



PS : Je me suis engagé vis-à-vis d'un client sur une solution de remplacement de texte dans un document xhtml que je pensais pouvoir réaliser relativement facilement.

J'ai d'abord commencé à écrire le programme php en utilisant des regex pour parser le code html et trouver les balises à remplacer ainsi que les contenus de remplacement.

Comprenant qu'il s'agit d'une méthode "de bricolage" (l'insistance de stealth pour parser du xhtml avec DomDocument a sensiblement contribué à cette compréhension ) et voyant que les sélections par regex pouvaient ne pas être fiables à tous les coups, même si parfois elles peuvent représenter une solution facile, je suis passé en cours de programmation à une logique DOM.

Bien mal m'en a pris et le choc de l'apprentissage forcé de DOM sur une application dépassant nettement les exemples classiques d'inventaire de livres (et pour laquelle il y a un engagement professionnel important) a été, et est encore, plus que rude.
Maintenant, je ne peux plus revenir en arrière et dois terminer le projet selon la logique DOM.

Je vais donc solliciter votre aide de façon plus accentuée (s'il vous plaît, autant que possible, pas d'indications générales !..) car je dois impérativement me sortir de cette ornière et livrer le travail que mon client attend avec impatience. (Il en a urgemment besoin pour ses propres clients qui eux aussi attendent avec impatience.)

Merci donc de tout coeur de toute l'aide que vous pourrez m'apporter.

En contrepartie, je m'engage, dès que j'aurai livré ce travail, à rédiger un tutoriel entièrement consacré au traitement d'un document html par DOM et basé sur des points concrets que j'ai dû résoudre. (Mon métier est précisément de rédiger des documents didactiques sur des notions pouvant être complexes.)
Doc_xhtml est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 00h32   #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,

Voici ma façon de faire ($current_node représente le noeud en cours d'analyse et de traitement) :

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
$type_of_markup = $current_node -> nodeName;
 
switch($type_of_markup)
{
	case 'span':
 
	if(($nbr_of_body_childNodes == 1) && ($body -> firstChild -> nodeName == 'p'))
	{
		$current_node -> nodeValue = $body -> firstChild -> nodeValue;
	}
	else if($nbr_of_body_childNodes == 1 && $body -> firstChild -> nodeName == 'img')
	{
		$current_node -> nodeValue = '';	
		$newnode = $document_xhtml -> importNode($body -> firstChild, true);
		$current_node -> appendChild($newnode);
	}
 
	break;
 
 
	case 'p':
 
		if($nbr_of_body_childNodes == 1 && $body -> firstChild -> nodeName == 'img')
		{
			traitement du cas p - img		
		}
 
		else if($nbr_of_body_childNodes == 1 && $body -> firstChild -> nodeName == 'p')
		{
			traitement du cas p - p
		}
 
		else if($nbr_of_body_childNodes == 1 && $body -> firstChild -> nodeName == 'div')
		{
			traitement du cas p - div
		}
 
		else if($nbr_of_body_childNodes > 1)
		{
			traitement du cas p - bloc xhtml		
		}
		break;
 
	case 'li':
		traitement ad hoc
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