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

Langage PHP Discussion :

Impossible de récupérer la balise image en xml


Sujet :

Langage PHP

  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut Impossible de récupérer la balise image en xml
    Bonjour,

    Avec la fonction php suivante, je n'arrive pas à récupérer la balise image du contenu de fichier suivant. Le reste est bon. (l'image est toujours dans le premier paragraphe, l'architecture est toujours la même, seul le texte et le nombre de paragraphes change).
    Fichier à décomposer:
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <section>
    <h2>Accueil en démo</h2>
    <div>
    <p><img src='customs/1/pictures/home.png' data-pos='1' />Proinde die funestis interrogationibus praestituto imaginarius iudex equitum resedit magister adhibitis aliis iam quae essent agenda praedoctis, et adsistebant hinc inde notarii, quid quaesitum esset, quidve responsum, cursim ad Caesarem perferentes, cuius imperio truci, stimulis reginae exsertantis aurem subinde per aulaeum, nec diluere obiecta permissi nec defensi periere conplures.</p>
    <p>Quibus ita sceleste patratis Paulus cruore perfusus reversusque ad principis castra multos coopertos paene catenis adduxit in squalorem deiectos atque maestitiam, quorum adventu intendebantur eculei uncosque parabat carnifex et tormenta. et ex is proscripti sunt plures actique in exilium alii, non nullos gladii consumpsere poenales. nec enim quisquam facile meminit sub Constantio, ubi susurro tenus haec movebantur, quemquam absolutum.</p>
    <p>Apud has gentes, quarum exordiens initium ab Assyriis ad Nili cataractas porrigitur et confinia Blemmyarum, omnes pari sorte sunt bellatores seminudi coloratis sagulis pube tenus amicti, equorum adiumento pernicium graciliumque camelorum per diversa se raptantes, in tranquillis vel turbidis rebus: nec eorum quisquam aliquando stivam adprehendit vel arborem colit aut arva subigendo quaeritat victum, sed errant semper per spatia longe lateque distenta sine lare sine sedibus fixis aut legibus: nec idem perferunt diutius caelum aut tractus unius soli illis umquam placet.</p>
    </div>
    </section>
    Code php : 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
    27
    28
    29
    function fromHtmlToXmlElements($htmlFilePath)
    {
    	define('XML_DOCTYPE', "<?xml version='1.0' encoding='utf-8' ?>");
    	$array = [];
     
    	if (!file_exists($htmlFilePath))
    	{
    		return ['h2'=>'', 'ps'=>[]];
    	}
    	// Création de la chaîne XML
    	$strHtml = file_get_contents($htmlFilePath);
    	$strHtml = str_replace(["\r", "\n"], '', $strHtml);
    	$patterns		= ['#(<!--.+-->)#isU', "#\t#", '#<br ?/>#', '#<q>(.*)</q>#isU'];
    	$replacements	= ['', '', PHP_EOL, '"$1"'];
    	$strHtml = preg_replace($patterns, $replacements, $strHtml);
    	$strHtml = XML_DOCTYPE.$strHtml;
     
    	// Décompostion de la chaîne $strHtml
    	$xml = new SimpleXMLElement($strHtml);
    	$array['h2'] = (string)$xml->h2;
    	$result = $xml->xpath('/section/div/p');
    	while(list( , $node) = each($result)) {
    		$array['ps'][] = (string)$node;
    	}
    	$result = $xml->xpath('/section/div/p/img');
    	var_dump((string)$result[0]);
     
    	return $array;
    }

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    img est une balise "auto-fermante" (self-closing tag), il est donc normal que la chaîne renvoyée soit vide. Par contre ta requête xpath renvoie bien une instance de simpleXMLElement. Pour t'en convaincre tu peux par exemple afficher les attributs de ta balise img avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach ($result[0]->attributes() as $name => $value) {
        echo $name, " = ", $value, PHP_EOL;
    }
    ou encore, si tu n'as besoin que de l'attribut src, changer ta requête xpath en: /section/div/p/img/@src

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Suite à tes précédents posts, je crois savoir ce que tu veux faire.
    Tu t'y prends mal. Ta conception est mauvaise.

    Voilà comment je ferais.
    Il te faut 2 fichiers distincts :
    • Le 1er contient les données modifiables (les datas)
    • Le 2eme la structure HTML nécessaire pour l'affichage (le gabarit)

    Ensuite :
    • une fonction PHP pour récupérer les données
    • un formulaire, avec traitement, pour modifier les données
    • Un 3eme fichier, complet, peut être (re-)généré à partir des 2 autres à chaque modification des données (pour éviter de le générer à la volée à l'affichage)


    1er fichier my-datas.txt (ou .xml) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <my_datas>
      <my_titre>Accueil en démo</my_titre>
      <my_img_url>customs/1/pictures/home.png</my_img_url>
      <my_img_pos>1</my_img_pos>
      <my_contenu><p>Proinde die funestis interrogationibus praestituto imaginarius iudex equitum resedit magister adhibitis aliis iam quae essent agenda praedoctis, et adsistebant hinc inde notarii, quid quaesitum esset, quidve responsum, cursim ad Caesarem perferentes, cuius imperio truci, stimulis reginae exsertantis aurem subinde per aulaeum, nec diluere obiecta permissi nec defensi periere conplures.</p>
    <p>Quibus ita sceleste patratis Paulus cruore perfusus reversusque ad principis castra multos coopertos paene catenis adduxit in squalorem deiectos atque maestitiam, quorum adventu intendebantur eculei uncosque parabat carnifex et tormenta. et ex is proscripti sunt plures actique in exilium alii, non nullos gladii consumpsere poenales. nec enim quisquam facile meminit sub Constantio, ubi susurro tenus haec movebantur, quemquam absolutum.</p>
    <p>Apud has gentes, quarum exordiens initium ab Assyriis ad Nili cataractas porrigitur et confinia Blemmyarum, omnes pari sorte sunt bellatores seminudi coloratis sagulis pube tenus amicti, equorum adiumento pernicium graciliumque camelorum per diversa se raptantes, in tranquillis vel turbidis rebus: nec eorum quisquam aliquando stivam adprehendit vel arborem colit aut arva subigendo quaeritat victum, sed errant semper per spatia longe lateque distenta sine lare sine sedibus fixis aut legibus: nec idem perferunt diutius caelum aut tractus unius soli illis umquam placet.</p></my_contenu>
    </my_datas>
    Chaque balise correspond à une seule donnée (tout comme on le ferait en enregistrant dans une table de bdd)
    C'est celui-là que tu vas parser pour récupérer tes données :
    • soit pour l'affichage (via le gabarit)
    • soit pour les modifications (via un formulaire)



    Le 2eme my-gabarit.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <section>
    <h2><?php echo $my_titre; ?></h2>
    <figure class="img-pos-<?php echo $my_img_pos; ?>">
      <img src="<?php echo $my_img_url; ?>" />
    </figure>
    <div>
      <?php echo $my_contenu; ?>
    </div>
    </section>
    Celui-ci sert au formatage HTML pour l'affichage.
    J'ai optimisé aussi la structure HTML.

    N.B. Tu vois que :
    • dans my-datas.txt, tu pourras à volonté ajouter d'autres données : my_date_update, my_img_title,.....
    • dans my-gabarit.php, tu pourras modifier la structure HTML, sans changer la fonction de parsage.
    Dernière modification par Invité ; 14/05/2018 à 10h50.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Citation Envoyé par jreaux62
    Suite à tes précédents posts, je crois savoir ce que tu veux faire.
    Tu t'y prends mal. Ta conception est mauvaise.
    Je crois que tu as parfaitement compris. Je peux essayer mais plus fondamentalement, est-ce que je n'aurais pas intérêt à utiliser carrément une autre solution plus adaptée? Je suis par exemple en train de tester une solution de décomposition du code html avec des expressions régulières, ce qui ne s'avère pas plus facile. Qu'en pensez-vous?
    N.B. J'ai beaucoup moins de problèmes pour l'écriture.

  5. #5
    Invité
    Invité(e)
    Par défaut
    ...décomposition du code html avec des expressions régulières...
    C'est la pire des solutions !


  6. #6
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Merci pour la suggestion d'utiliser DOMDocument. Il semblerait que ce soit une très bonne solution. Je rencontre pourtant trois problèmes:
    • La balise section n'est pas reconnue par le constructeur DOMDocument qui crée une exception.
    • La balise h2 est retournée vide.
    • L'encodage n'est pas bon, alors que les deux lignes de vérification renvoient true ( plus haut mon code contient -- mb_internal_encoding('UTF-8'); -- et le problème persiste si je précise la version 1.0 et l'encodage en paramètre. De même la chaîne provient d'un fichier encodé en UTF-8. Elle apparaît ici correctement codée en ligne 6. )

    Code php : 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
    27
    28
    29
    function fromHtmlToArray(string $strHtml, array $arrTags)
    {
    	// Voir le problème de la balise section
    	// Voir la balise h2
    	// Voir l'encodage
    	$strHtml = "<h2>Accueil en démo</h2>
    <div>
    <p><img src='customs/1/pictures/home.png' data-pos='1' />Proinde die funestis interrogationibus praestituto imaginarius iudex equitum resedit magister adhibitis aliis iam quae essent agenda praedoctis, et adsistebant hinc inde notarii, quid quaesitum esset, quidve responsum, cursim ad Caesarem perferentes, cuius imperio truci, stimulis reginae exsertantis aurem subinde per aulaeum, nec diluere obiecta permissi nec defensi periere conplures.</p>
    <p>Quibus ita sceleste patratis Paulus cruore perfusus reversusque ad principis castra multos coopertos paene catenis adduxit in squalorem deiectos atque maestitiam, quorum adventu intendebantur eculei uncosque parabat carnifex et tormenta. et ex is proscripti sunt plures actique in exilium alii, non nullos gladii consumpsere poenales. nec enim quisquam facile meminit sub Constantio, ubi susurro tenus haec movebantur, quemquam absolutum.</p>
    <p>Apud has gentes, quarum exordiens initium ab Assyriis ad Nili cataractas porrigitur et confinia Blemmyarum, omnes pari sorte sunt bellatores seminudi coloratis sagulis pube tenus amicti, equorum adiumento pernicium graciliumque camelorum per diversa se raptantes, in tranquillis vel turbidis rebus: nec eorum quisquam aliquando stivam adprehendit vel arborem colit aut arva subigendo quaeritat victum, sed errant semper per spatia longe lateque distenta sine lare sine sedibus fixis aut legibus: nec idem perferunt diutius caelum aut tractus unius soli illis umquam placet.</p>
    </div>
    ";
    	var_dump($strHtml);
    	var_dump(mb_check_encoding($strHtml, 'UTF-8'));
    	var_dump(mb_check_encoding($strHtml));
    	$doc = new DOMDocument(); // Ne supporte pas la balise section
    	$doc->loadHTML($strHtml);
     
    	$arrOut = [];
    	foreach ($arrTags as $tag)
    	{
    		$arrElements = $doc->getElementsByTagName($tag);
    		foreach ($arrElements as $element)
    		{
    			$arrOut[$tag][] = $element->nodeValue;
    		}
    	}
    	var_dump($arrOut);
    }

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je t'ai indiqué une méthodologie, pratique et fonctionnelle.

    Sinon, tant pis.

    Et ta structure HTML est toujours mauvaise.

  8. #8
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Mais tu m'as aussi indiqué l'utilisation de DOMDocument, alors que choisir ? Quant à la structure html, je vais la reprendre.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par moimp Voir le message
    Je crois que tu as parfaitement compris...
    Alors pourquoi chercher midi à 14h ?

  10. #10
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    J'ai réussi à faire quelque chose de satisfaisant avec ta méthode. Il me reste encore un petit problème à régler, si toutefois c'est possible: Comment positionner l'image habillée par le texte donc flottante en bas du texte.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/12/2012, 16h29
  2. Récupérer valeur balise dans fichier XML
    Par jamy69 dans le forum VBScript
    Réponses: 3
    Dernier message: 24/05/2012, 16h45
  3. [XML] HTML dns XML -> Récupérer les balises intérprétées comme du XML
    Par dacid dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 16/04/2010, 17h59
  4. Récupérer plusieurs balises dans un fichier XML
    Par sandddy dans le forum Langage
    Réponses: 3
    Dernier message: 28/01/2009, 14h48
  5. Réponses: 2
    Dernier message: 08/12/2006, 15h29

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