HXT - ce qui est « profond »?
Question
Je suis en train dans beaucoup de temps à essayer de comprendre comment utiliser HXT. Je continue à venir contre des exemples utilisant deep
. Qu'est-ce deep
faire?
Par exemple, ce code a ce qui suit:
atTag tag = deep (isElem >>> hasName tag)
-- case-insensitive tag matching
atTagCase tag = deep (isElem >>> hasNameWith ((== tag') . upper . localPart))
where tag' = upper tag
upper = map toUpper
La solution
http: //hackage.haskell.org/packages/archive/hxt/latest/doc/html/Control-Arrow-ArrowTree.html#v:deep
deep :: Tree t => a (t b) c -> a (t b) cSource
recherche récursive un arbre entier pour les sous-arbres, dont un prédicat détient. La recherche est effectuée haut vers le bas. Quand un arbre se trouve, cela devient un élément de la liste des résultats. L'arbre est Trouvées pas examiné plus pour tout subtress, pour lesquels le prédicat pourrait également tenir. Voir
multi
pour ce type de recherche.Exemple:
deep isHtmlTable
Sélectionne tous les éléments de table de niveau supérieur dans un document (avec une définition appropriée pourisHtmlTable
) mais pas de tables ayant lieu dans une cellule de table.
Vous pourriez trouver la documentation donnée un nom de fonction ou de type signature avec Hoogle ou Hayoo!
En fait, si l'arbre XML est comme
<p>
<strong id="a">
<em id="b">
<strong id="c">
foo
</strong>
</em>
</strong>
<ins id="d">
<strong id="e">
bar
</strong>
<em id="f">
baz
</em>
</ins>
</p>
deep (isElem >>> hasName "strong") tree
retourne une liste
<strong id="a">
<strong id="e">
parce que nous pouvons trouver ces deux <strong>
s lors de la marche dans l'arbre, tandis que (isElem >>> hasName tag) tree
retourne une liste vide parce que la racine de l'arbre est un <p>
, pas <strong>