Moteur de recherche XML

Mammouth du PHP | 536 Messages

29 juin 2007, 11:49

Bonjour je ne sais pas trop comment orienter ma réflexion.
Voilà, j'ai un fichier xml qui contient des méthode de travail, un fichier xml qui contient des critères de recherche et un fichier xml (une matrice) qui fait le lien entre ces deux fichiers xml.

Je vais être sur le point de développer un script php qui permettra de rechercher les méthodes de travail en fonction des critères que l'utilisateur aura sélectionner.

Voilà, mais là je ne pas trop comment orienter mon travail et quel raisonnement adopter.

Si quelqu'un pouvait m'aider.
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 !!

Mammouth du PHP | 693 Messages

29 juin 2007, 12:37

A priopri la, comme ca, je vois pas. Si tu metais des portions de chacun des fichiers, ca aiderai peut être :D

Mammouth du PHP | 536 Messages

29 juin 2007, 13:29

voila le fichier practice.xml

Code : Tout sélectionner

<root> <practice id="1" name="practice1" viewed="24" used="2" subjected="1" validated="1" subjected_press="1" status="1" /> <practice id="2" name="practice2" viewed="123" used="21" subjected="1" validated="1" subjected_press="1" status="1" /> <practice id="3" name="practice3" viewed="0" used="0" subjected="1" validated="0" subjected_press="0" status="0" /> </root>
le fichier criteria.xml

Code : Tout sélectionner

<root> <cat id="1" name="new"> <criteria id="1" name="Growth" /> <criteria id="2" name="Efficiency" /> <criteria id="3" name="People" /> <criteria id="4" name="Customer Attitude" /> <criteria id="5" name="Innovation" /> <criteria id="6" name="Entrepreneurship" /> </cat> <cat id="2" name="Channels Managment"> <criteria id="1" name="Panel Builders" /> <criteria id="2" name="Contractors" /> <criteria id="3" name="Distributors" /> <criteria id="4" name="System Integrators" /> <criteria id="5" name="Electric Utility" /> <criteria id="6" name="End User" /> <criteria id="7" name="Design Offices" /> </cat> <cat id="3" name="Offer"> <criteria id="1" name="Industrial Automation" /> <criteria id="2" name="Electrical Distribution" /> <criteria id="3" name="Building Automation" /> <criteria id="4" name="Solutions" /> <criteria id="5" name="Services" /> <criteria id="6" name="Energy Efficiency" /> </cat> <cat id="4" name="Business"> <criteria id="1" name="Price" /> <criteria id="2" name="Sales Efficiency" /> <criteria id="3" name="Standards and Rules" /> </cat> <cat id="5" name="Segments"> <criteria id="1" name="Oil and Gas" /> <criteria id="2" name="Water" /> <criteria id="3" name="Marie" /> <criteria id="4" name="Data Telecom" /> <criteria id="5" name="Airports" /> <criteria id="6" name="Building" /> <criteria id="7" name="Energy" /> <criteria id="8" name="Industry" /> </cat> </root>
et le fichier criteria-practice.xml (une matrice)

Code : Tout sélectionner

<root> <link id="1"> <item type="criteria" id="1" /> <item type="practice" id="2" /> </link> <link> <item type="criteria" id="7" /> <item type="practice" id="3" /> </link> </root>
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 !!

Mammouth du PHP | 693 Messages

29 juin 2007, 13:42

Il y a un petit problème à mon avis.

Dans la matrice, il y a une seule référence pour les critères alors qu'ils sont au deuxième niveau dans le fichier criteria...

Il me semble qu'il faudrait plutot organiser la matrice ddans ce style :

Code : Tout sélectionner

<link id="1"> <item type="criteria" catid="1" critid="2" /> <item type="practice" id="2" /> </link>

Mammouth du PHP | 536 Messages

29 juin 2007, 13:44

effectivement oui, petite erreur de ma part. Merci de l'avoir relevé, je n'avais pas fait attention.
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 !!

Mammouth du PHP | 693 Messages

29 juin 2007, 13:52

Enfin, maintenant, en réfléchissant, pourquoi tu ne mets pas les liens directement dans les critères, de cette manière :

Code : Tout sélectionner

<criteria id="6" name="Entrepreneurship" > <link pratice="1" /> <link pratice="4" /> </criteria>
Ca te suprime un fichier déjà...

Mammouth du PHP | 536 Messages

29 juin 2007, 14:05

ben parceque je veux que ce soit clair. Je veux avoir mon petit fichier qui correspond à un truc : un fichier pour les critères, un fichiers pour les methodes de travail et un fichier qui lie les deux. C'est pour des raisons d'organisation
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 !!

Mammouth du PHP | 693 Messages

29 juin 2007, 14:36

Ok.

Le problème avec le fichier pratice-criteria, c'est qu'il est difficile à exploiter, pour la simple raison que la balise <item> renvoie à deux choses différentes, un lien vers pratice pour l'un et un lien vers criteria pour l'autre.

Soit tu fait cette organisation :

Code : Tout sélectionner

<root> <link id="1"> <criteria idcat="1" idcrit="3" /> <practice id="2" /> </link> <link> <criteria idcat="5" idcrit="7" /> <practice id="3" /> </link> </root>
Soit cette organisation

Code : Tout sélectionner

<root> <link id="1" idcat="1" idcrit="3" idprat="2" /> <link id="2" idcat="5" idcrit="7" idprat="3" /> </root>
Pour la première organsiation, voila un code qui te permetera d'obtenir les practice dans le cas d'un seul critère. Pour plusieurs critères, ca dépend de ce que tu veux.

Code : Tout sélectionner

<?php $xml = simplexml_load_file('link.xml'); foreach($xml->link as $value) { if($value->criteria[0]['idcat']==1 and $value->criteria[0]['idcrit']==3) { $practice[]=(int)$value->practice[0]['id']); } } ?>

Mammouth du PHP | 536 Messages

29 juin 2007, 14:47

effectivement, ta première organisation du fichier xml est plus optimale que la mienne et prêtera moins à confusion.

je vais exploiter ton code et voire si on peut le modifier pour plusieurs critères sachant que les critères je les affiche de cette façon :
//on ouvre le fichier criteria.xEml
$accessFile = $cfg['ressources_root'].'criteria.xml';
$domAccess = new DOMDocument('1.0','UTF-8');
$domAccess->load($accessFile);
$xpAccess = new DOMXPath($domAccess);

$cat_criteria = $domAccess->getElementsByTagName('cat');
$result_find_criteria = $domAccess->getElementsByTagName('criteria');


echo "<ul>";
foreach($cat_criteria as $cat)
{
  $name_cat = $cat->getAttribute('name');
  echo "<br /><li>".$name_cat."</li>";
  foreach ($cat->childNodes as $criteria)
  {
    if ($criteria->nodeType != XML_ELEMENT_NODE) continue;
    if ($criteria->tagName == 'criteria')
    {
      $name_criteria = $criteria->getAttribute('name');        
      echo "<ul><li>".$name_criteria."</li></ul>";
    }
  }
}
echo "</ul>";
il ne me reste plus qu'a les intégrer dans des boutons checkbox.
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 !!

Mammouth du PHP | 693 Messages

29 juin 2007, 14:52

Bon, tu utilise la classe DOM et moi la classe SimpleXML, ca va pas aider :lol:

Mammouth du PHP | 536 Messages

29 juin 2007, 14:56

effectivement, je viens de voir ca et je ne comprends pas trop ton code finalement.
Tu pourrais commenter ton petit bout de code.
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 !!

Mammouth du PHP | 693 Messages

29 juin 2007, 15:15

SimpleXML convertit un fichier XML en un objet-tableau.

Chaque type de balise enfant de la racine est une propriété qui est un tableau indexé numériquement et chaque index est un nouvel objet SimpleXML.
Chaque attribut est un index de l'objet, bien que ce ne soit pas vriament un tableau.

Ainsi, $xml->link est un tableau que je parcourt avec foreach. Chaque valeur est un objet simpleXML.

Ensuite $value->criteria[0]['idcat']. Il s'agit de récupérer la valeur de l'attribut idcat du premier enfin criteria de la balsie link analysé. Pareil pour $value->criteria[0]['idcrit'] et $value->practice[0]['id'].

Ensuite, vu que ca retourne quand même un objet SimpleXML, je préfaire le transformer en entier l'id de la balise practice que je stocke dans un tableau.

Mais bon, puisque tu as plus l'habitude d'utiliser le DOM, je ne suis pas le mieux placé pour t'aider.

Mammouth du PHP | 536 Messages

29 juin 2007, 15:18

et comment tu fais pour afficher les résultats trouvés alors ?
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 !!

Mammouth du PHP | 693 Messages

29 juin 2007, 15:29

Ben aprait, il suffit d'exploiter le tableau. Mais ce bout de code est plus simple car peux facilement être transformer en fonction (faudrait juste sortir le parsage du XML) et permettre d'avoir des recherches croisées.

Si tu as plusieurs critères et que les methodes doivent être dans tout les critères, ensuite, il suffit de traiter les tableau pour voir quels sont les valeurs communes.

Mammouth du PHP | 536 Messages

29 juin 2007, 15:31

houla ça va être chaud. ;). Je débute en XML
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 !!