HXT - ciò che è “profonda”?
Domanda
sto mettendo in un sacco di tempo a cercare di capire come utilizzare HXT. Continuo a contro esempi utilizzando deep
. Cosa fa deep
fare?
Per esempio, questo codice ha il seguente:
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
Soluzione
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
Ricerche ricorsivamente un albero intero per sottostrutture, per il quale un predicato detiene. La ricerca viene effettuata dall'alto verso il basso. Quando viene trovato un albero, questo diventa un elemento della lista dei risultati. Il TROVATO albero non viene ulteriormente esaminato per qualsiasi subtress, per cui il predicato anche potrebbe contenere. Vedere
multi
per questo tipo di ricerca.esempio: seleziona
deep isHtmlTable
tutti gli elementi della tabella di alto livello in un documento (con una definizione appropriata perisHtmlTable
) ma nessuna tabella verificano all'interno di una cella.
Si potrebbe trovare la documentazione dato un nome di funzione o il tipo di firma con Hoogle o Hayoo!
In sostanza, se l'albero XML è come
<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
restituirà un elenco per
<strong id="a">
<strong id="e">
perché possiamo trovare queste due <strong>
s quando si cammina in albero, mentre (isElem >>> hasName tag) tree
restituirà un elenco vuoto, perché la radice dell'albero è un <p>
, non un <strong>