[RESOLU] DOMDocument ou SimpleXMLElement

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] DOMDocument ou SimpleXMLElement

Re: DOMDocument ou SimpleXMLElement

par mctarek » 24 avr. 2013, 10:31

Bonjour. Je me doutais que la réponse ne pouvait venir que de mes propres recherches.
Après avoir longuement étudié DOMDocument (passionant), voici la solution qui servira à une fonction d'auto-apprentissage pour un bot écrit en AIML.

$string = <<<XML
<template>
Texte 1
<random><li>choix1</li></random>
</template>
XML;

// New knowledge
$data = 'choix2';

// create $dom object
$dom = new DOMDocument('1.0', 'utf-8');
// load xml string into $dom
$dom->loadXML($string);

// $dom root node
$template = $dom->documentElement;
// echo $template->nodeName; // template

$template = $dom->getElementsByTagName('template')->item(0);
$random = $dom->getElementsByTagName('random')->item(0);

$texte = $template->firstChild->nodeValue;

if (isset($random)) {
	$new_li = $dom->createElement('li',$data);
	// add new li into existing <random/>
	$random->appendChild($new_li);
	} else {
// create new <random/ > with first <li/>
$random = $dom->createElement('random');
$first_li = $dom->createElement('li','choix1');
$random->appendChild($first_li);
$dom->appendChild($random);
}

$new_random = trim($texte.$dom->saveXML($random));

echo $new_random; // update MYSQL DB
Si vous voulez en savoir plus sur AIML : http://mctarek2.free.fr/phorum/list.php?8

mctarek

DOMDocument ou SimpleXMLElement

par mctarek » 23 avr. 2013, 12:25

Bonjour. Je suis embourbé dans les méandres de PHP et XML dans un problème qui me tient à coeur et dont je ne parviens pas à résoudre malgré la documentation de php.net. Je ne sais même pas si je dois passer par DOMDocument ou SimpleXMLElement :!:

voici mon problème. Je récupère une chaîne dans une table SQL (utf8) qui peut être sous 2 formes :
- une simple chaîne de texte : texte1
- une chaîne xml sous la forme [xml]texte1 <random><li>choix1</li></random>[/xml]

+ Si simple chaîne, je dois obtenir cette structure [xml]<template>texte1 <random><li>choix1</li></random></template>[/xml]
+ Si <random/> existant, je dois ajouter un 2è choix soit [xml]<template>texte1 <random><li>choix1</li><li>choix2</li></random></template>[/xml]

Il faudra donc parcourir la chaîne et voir si présence de <random/>.

J'ai commencé l'exercice avec <random/> existant :
$string = <<<XML
Texte 1
<random>
<li>choix1</li>
</random>
XML;

$dom = new DOMDocument('1.0', 'utf-8');
$dom->loadXML($string);
// créer un élement <template/>
$template = $dom->createElement('template', $string);
$dom->appendChild($template); 
$root = $dom->saveXML($template); // retire <xml/> tag => <template>text1<random><li>choix1</li></random></template>
echo $root;
Ici, j'ai réussi à envelopper $string avec <template/> afin de pouvoir travailler sur tous les noeuds (texte, random et li)

Le plus dur vient après : comment detecter <random/> et ajouter un <li/>

J'ai tenté la suite suivante :
$random = $dom->getElementsByTagName('random'); 

if (isset($random)) {
	// ajouter nouveau li dans <random/>
	
} else {
// créer nouveau <random/ > avec premier <li/>

}

//afficher tout le <template>texte1<random><li>choix1</li><li>choix2</li></random></template>

// unwrapper <template/> pour mise à jour dans BDD et avoir texte1<random><li>choix1</li><li>choix2</li></random>

Un grand merci à ceux qui peuvent m'aider et je demande l'indulgence pour la non maîtrise de PHP/XML.

mctarek