[JAVA-SAX]Parser un xml avex des tags homonymes

Hugh

Voilà la situation: on me demande de parser des fichiers xml contenant chacun une offre de produit, afin de créer des objets contenant ces infos.
Là où ça coince un peu, c’est qu’au niveau de ces offres on trouve parfois des tags qui ont le même nom au sein du fichier (par exemple <catégorie>, une fois pour le fournisseur, une fois pour le produit). A ce stade du projet, je peux encore me permettre de modifier les tags en question pour les différencier (genre <catégorieFournisseur> et <catégorieProduit>), mais bon c’est un peu cheap.

Donc de ce que j’ai compris il existe deux méthodes pour gérer ce problème: “retenir” dans quel élément on se trouve au moyen de flags, ou bien créer des genres de sous-fonctions dans le parser qui vont chacune gérer un type d’élément.

J’aimerais savoir si je me gourre pas la théorie, et quelle méthode je devrais privilégier pour des petits traitements. D’ailleurs, comme il n’y a jamais qu’une offre par fichier, ne serait-il pas possible de se baser sur l’ordre des éléments dans le fichier? (parce que je sais pas si les évènements SAX suivent le même ordre).

Question bonux: n’est-il pas possible de récupérer le path complet d’un élément plutôt que juste le local name?

Merci d’avance

Je ne vais pas répondre à ta question mais as tu regardé du coté de common digester ? C’est ici et c’est du apache donc ça tue forcement :stuck_out_tongue:

Je vais faire une réponse rapide. Mais dès que j’ai eu à analyser des fichiers XML. J’utilisai pas mal XPath plutôt qu’un parseur Sax “classique”. Ca permet de travailler sur l’arbre complet et non juste sur le nom de la balise.

Comme ZGoblin, Xpath fonctionne bien.

exemple en php :

$listSkill = simplexml_load_file($nameFileSkill);
$result_skill = $listSkill->xpath('result/rowset[@name="skillGroups"]/row[@groupName and @groupID]');

La je récupère le fichier et il le load dans un tableau ‘xml’.
Ensuite dans le xpath ça récupère tous les résultats ayant cette forme dans le xml en partant du début de l’arbre et me les stocks en Tableau.

<result>
 <rowset name="skillGroups">
  <row groupeName="blabla" groupID="87">
  </row>
 </rowset>

 <rowset name="skillGroups">
  <row groupeName="blabla2" groupID="42" >
  </row>
 </rowset>
</result

J’espère que je m’explique bien, n’étant pas un habitué des xpath.

J’aurais du préciser que je suis obligé d’utiliser SAX pour cette appli :stuck_out_tongue: mais Xpath me servira plus tard, donc j’apprécie la documentation :slight_smile:

Si tu est « obligé » d’utiliser du SAX, dans ce cas, tu peux effectivement utiliser des flags pour enregistrer dans quel noeux tu es passé. �?a fonctionne lorsque tes fichiers XML ne sont pas très compliqués mais ça devient vite lourd pour de gros fichiers ou lorsque tu as beaucoup de traitement à faire sur différents noeud.
Je persiste à dire qu’utiliser une solution XPath est beaucoup plus facile, beaucoup plus léger et beaucoup plus maintenable.

Je crois que c’est pour un travail pour ses études, donc il est obligé d’utiliser ce qu’on lui dit d’utiliser.

Il y a une typo non? :slight_smile:
XPath travaille sur du DOM, donc il parse tout le document, en fait un arbre, et travaille sur l’arbre. C’est donc pas très léger.

Lupus, le principe de SAX en gros, c’est de construire un automate qui te permet de savoir dans quel état tu es, et quels états tu dois traverser avant d’atteindre l’état de sortie de ton automate, qui correspond à « ce que je veux choper ».

Merci pour l’info, donc effectivement SAX est une meilleure solution pour traiter des grosses volumétries avec un minimum de mémoire (contrairement à XPath).

Pourquoi tu es obligé d’utiliser SAX en fait?
Si c’est pour créer des objets à partir des fichiers (simple unmarshalling) pourquoi ne pas utiliser un petit framework qui sait faire ça?
Par exemple j’ai utilisé XStream et j’ai trouvé ça léger et efficace (il sait utiliser des api de streaming genre XPP3 ou StAX… donc lecture directe également…). Ca pourrait peut-être te convenir?

Je dis ça pour toi… parce que parser des fichiers XML en SAX direct c’est toujours prise de tête (et potentiellement très pénible à faire évoluer un jour).

Voir le post de Glaso :stuck_out_tongue:

J’ai écrit mon parser avec SAX, avec deux petites alternatives pour les balises homonymes, ça n’a posé aucun problème. Les fichiers xml du projet ne doivent pas évoluer plus tard, donc c’est parfait.

Case closed :slight_smile: