Page 1 sur 2
Moteur de recherche XML
Posté : 29 juin 2007, 11:49
par béka
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.
Posté : 29 juin 2007, 12:37
par orgerix
A priopri la, comme ca, je vois pas. Si tu metais des portions de chacun des fichiers, ca aiderai peut être

Posté : 29 juin 2007, 13:29
par béka
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>
Posté : 29 juin 2007, 13:42
par orgerix
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>
Posté : 29 juin 2007, 13:44
par béka
effectivement oui, petite erreur de ma part. Merci de l'avoir relevé, je n'avais pas fait attention.
Posté : 29 juin 2007, 13:52
par orgerix
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à...
Posté : 29 juin 2007, 14:05
par béka
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
Posté : 29 juin 2007, 14:36
par orgerix
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']);
}
}
?>
Posté : 29 juin 2007, 14:47
par béka
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.
Posté : 29 juin 2007, 14:52
par orgerix
Bon, tu utilise la classe DOM et moi la classe SimpleXML, ca va pas aider

Posté : 29 juin 2007, 14:56
par béka
effectivement, je viens de voir ca et je ne comprends pas trop ton code finalement.
Tu pourrais commenter ton petit bout de code.
Posté : 29 juin 2007, 15:15
par orgerix
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.
Posté : 29 juin 2007, 15:18
par béka
et comment tu fais pour afficher les résultats trouvés alors ?
Posté : 29 juin 2007, 15:29
par orgerix
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.
Posté : 29 juin 2007, 15:31
par béka
houla ça va être chaud.

. Je débute en XML