2012-08-22 4 views
3

J'écris une petite application qui vise à extraire le XML de plusieurs sites et à traiter les données comme je le souhaite. J'ai fait une telle demande auparavant mais dans différentes langues et j'écris celle-ci pour la pratique de Haskell.Ignorer les attributs XML avec HXT unpickler

Quoi qu'il en soit, au fait. Après avoir regardé le Web au million et un parseurs XML différents, j'ai décidé d'aller avec HXT parce que qui n'aime pas les flèches. Suite à la page http://www.haskell.org/haskellwiki/HXT/Conversion_of_Haskell_data_from/to_XML je suis arrivé à quelque chose qui semble lire mon fichier XML et le mettre dans les types de données Haskell que j'ai définis. J'utilise des instances de XmlPickler pour lire les données du fichier pour y parvenir. Je suis arrivé à quelque chose qui fonctionnerait, sauf pour cette erreur:

Je suis conscient que je n'ai pas traité tous les attributs. Je ne veux pas tous les attributs. Y a-t-il un moyen de les ignorer? J'imagine que je pourrais traiter tous les attributs, les mettre dans un nouveau type de données et en extraire des attributs pour obtenir les données que je veux réellement. Je voudrais éviter ce petit bidouillage et je suis donc ici pour demander The Proper Way ™. Est-ce que j'utilise le mauvais outil pour le travail? Est-ce que le démélage des données d'un tiers est dangereux (comme c'est le cas en Python)?

J'ai regardé autour du Web pour une solution mais Text.XML.HXT.Arrow.XmlState.SystemConfig ne semble pas avoir ce dont j'ai besoin pour désactiver ce comportement.

+2

vous pouvez trouver un excellent article pour commencer avec hxt ici: http: // adit.io/posts/2012-04-14-working_with_HTML_in_haskell.html – fp4me

+0

J'ai travaillé avec cet article hier, quelques heures après avoir posté ma question. Je pense que c'est plutôt bien! –

Répondre

5

Je suis tombé sur ce problème exact, l'autre jour, et est venu à la conclusion suivante:

Am I using the wrong tool for the job?

Oui. La fonctionnalité pickle de HXT est conçue pour la sérialisation et la désérialisation des données facilement, mais sans grande flexibilité. A partir de la page liée:

They are intended to read machine generated XML, ideally generated by the same pickler.

En ce qui concerne:

Is unpickling 3rd party data unsafe (like it is in Python)?

Pas avec HXT, non. Le décapage en python est dangereux car il équivaut à appeler éval() sur du contenu arbitraire. HXT est juste un analyseur XML, il n'y a pas d'appel de code arbitraire.

Personnellement, je suis passé à traiter manuellement XML en utilisant le package xml (Text.XML.Light) au lieu d'essayer d'obtenir les sélecteurs HXT pour faire ce que je veux. Ce n'est pas aussi concis, mais cela me permet d'ignorer les données dont je ne me soucie pas. Vous pourriez probablement utiliser aussi bien les parties non-pickle de HXT, si vous aimez les flèches (j'enveloppe toujours ma tête autour d'elles;)).

3

Vous pouvez ignorer les attributs XML avec xpFilterAttr et les balises XML avec xpFilterCont.

Commander ce code: https://hackage.haskell.org/package/hxt-9.3.1.4/docs/src/Text-XML-HXT-Arrow-Pickle-Xml.html

Comme ceci:

xpElem "assign" $ 
xpFilterAttr (hasName "comment") $ ... 

xpFilterCont est filtrage (sur la vraie condition) tous les tags suivants. Donc, la condition est vraie, une balise XML est préservée, sinon elle est filtrée. (< +>) combine certaines conditions avec la logique OU.

Questions connexes