Moteur de recherche XML

Mammouth du PHP | 693 Messages

29 juin 2007, 15:33

MOi aussi, mais c'est du PHP.

Le XML s'arrete à l'écriture et à la limité à l'exploitation du fichier. Ensuite, le maniment des données obtenu, c'est du PHP.

Mammouth du PHP | 536 Messages

29 juin 2007, 15:59

ok d'accord. Mais les fonctions que je n'ai pas l'habitude d'utiliser qui sont propre à xml du fait que je découvre xml sont pas évidente pour moi.

Mais sinon, comment faire le lien entre l'id du practice qu'on récupère dans le tableau et le practice qui se trouve dans le fichier practise.xml
Pourquoi cecin ne marche pas :
$practiceFile = $cfg['ressources_root'].'practice.xml';
$domPractice = new DOMDocument('1.0','UTF-8');
$domPractice->load($practiceFile);
$xpPractice = new DOMXPath($domPractice);
$result_find_practice = $domPractice->getElementById($practice[0]);
echo $result_find_practice;

if (isset($result_find_practice)){
  echo "practice 2";
  }
else {
  echo "pas de practice";
  }
en effet, j'ai à l'écran

Code : Tout sélectionner

"pas de practice"

[EDIT]Mais je pense à ça, on n'aurait pas intéret à utiliser xpath plutôt que de parcourir tout le fichier comme c'est le cas dans on script. Car si le fichier est volumineux, cela ne risque pas de "galérer un peu" ?
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

Invité
Invité n'ayant pas de compte PHPfrance

02 juil. 2007, 09:33

là je suis paumé. J'a repris ton code orgerix, mais là je n'arrive pas à afficher le résultat. Enfin la practice qui correspond à celle qui a été recherché : ici la practice 2.

En effet, dans le fichier practice.xml il y a les infos de celle-ci mais son contenu se trouve dans [id_practice].xml

Comment l'afficher et faire le lien entre les deux.

Si quelqu'un pouvait m'aider. J'ai continuer avec simpleXML orgerix ce sera moins lourd que DOM.

Mammouth du PHP | 536 Messages

02 juil. 2007, 13:32

Voilà, j'arrive à faire la recherche et à afficher le résultat.
Voici le code pour ceci :
<?
echo "<br /><br />Choose the different criteria which correspond to your request : ";
/*---------------------------------*/
//on ouvre le fichier criteria.xml
$criteriaFile = $cfg['ressources_root'].'criteria.xml';
$domCriteria = new DOMDocument('1.0','UTF-8');
$domCriteria->load($criteriaFile);
$xpCriteria = new DOMXPath($domCriteria);
$cat_criteria = $domCriteria->getElementsByTagName('cat');
$result_find_criteria = $domCriteria->getElementsByTagName('criteria');?>

<form name="critera" method="post" action="search-engine.php"><?
echo "<table align='center'><tr><ul>";
foreach($cat_criteria as $cat){
  $name_cat = $cat->getAttribute('name');
  $id_cat = $cat->getAttribute('id');
  echo "<td valign='top'><br /><input type=\"checkbox\" name=\"cat\" value=\"$id_cat\"><strong>".$name_cat."</strong></input>";
  foreach ($cat->childNodes as $criteria)
  {
    if ($criteria->nodeType != XML_ELEMENT_NODE) continue;
    if ($criteria->tagName == 'criteria')
    {
      $name_criteria = $criteria->getAttribute('name');
      $id_criteria = $criteria->getAttribute('id');      
      echo "<ul><input type=\"checkbox\" name=\"crit\" value=\"$id_criteria\">$name_criteria</input></ul>";
    }
  }
}
echo "</ul></tr></table>";?>
<input type="submit" value="Search" />
</form>
<?
/*-----------------------------------------------------*/
//on affiche le résultat en fonction d'un seul critère //
/*-----------------------------------------------------*/

$link_file = $cfg['ressources_root'].'/matrix/criteria-practice.xml';
$xml = simplexml_load_file($link_file);//on ouvre le fichier xml

//on vérifie l'existence des varaibles passées par le formulaire si elles n'existent pas, on meur affecte une valeur vide
if (!isset($_POST['cat'])) { $_POST['cat'] = ''; }
if (!isset($_POST['crit'])) { $_POST['crit'] = ''; }

//si les variables ne sont pas vides
if ( ($_POST['cat'] != '') or ($_POST['crit'] != '') )
{
  foreach($xml->link as $value)
  {
     if( $value->criteria[0]['idcat']==$_POST['cat'] or $value->criteria[0]['idcrit']==$_POST['crit'] )
     {
        $practice[]=( (int)$value->practice[0]['id'] );
        if (isset($practice[0]))
        {
          $id_practice = $practice[0];
        }
        else $id_practice = '';
     }
  }
  if ( (isset($id_practice)) and ($id_practice != '') ) // si $id_practice n'est pas vide
  { 
    //on ouvre le document xml qui correspond à la recherche
    $practiceFile = $cfg['ressources_root'].'content/practice/'.$id_practice.'.xml';
    $domPractice = new DOMDocument('1.0','UTF-8');
    $domPractice->load($practiceFile);
    $xpPractice = new DOMXPath($domPractice);
    $item_practice = $domPractice->getElementsByTagName('item');


    foreach ($item_practice as $item) 
    {
      foreach ($item->childNodes as $child)
      {
        if($child->nodeType != XML_ELEMENT_NODE) continue;
        if($child->tagName == 'title')
        {
          $titre = utf8_decode($child->firstChild->nodeValue);
        }
        elseif ($child->tagName == 'short_description')
        {
          $short_description = utf8_decode($child->firstChild->nodeValue);
        }
      }
      $msg = "<p>$titre<br/>$short_description</p>";
    }
  }
  else
  { 
    $msg = "<p>Il n'y a pas de practice qui correspond à votre requête, veuillez reformuler une recherche</p>";
  }
  echo $msg;
}?>
Seulement, je n'arrive pas à faire en sorte que cette requête soit multi-critère.
Pouvez me suggérer des améliorations à apporter à mon code pour le rendre optimal et aussi pour faire cette recherche multi-critères.
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!