Vous pouvez résoudre cela en utilisant the Tupelo Forest library pour traiter En plus de la recherche explicite, il peut également utiliser des caractères génériques comme zsh
, Documentation is ongoing, mais cela vous donnera un avant-goût de ce que vous pouvez faire:
(dotest
(with-forest (new-forest)
(let [xml-str "<top>
<group>
<group>
<item>
<number>1</number>
</item>
<item>
<number>2</number>
</item>
<item>
<number>3</number>
</item>
</group>
<item>
<number>0</number>
</item>
</group>
</top>"
enlive-tree (->> xml-str
java.io.StringReader.
en-html/xml-resource
only)
root-hid (add-tree-enlive enlive-tree)
; Removing whitespace nodes is optional; just done to keep things neat
blank-leaf-hid? (fn fn-blank-leaf-hid? ; whitespace pred fn
[hid]
(let [node (hid->node hid)]
(and (contains-key? node :value)
(ts/whitespace? (grab :value node)))))
blank-leaf-hids (keep-if blank-leaf-hid? (all-leaf-hids)) ; find whitespace nodes
>> (apply remove-hid blank-leaf-hids) ; delete whitespace nodes found
La partie qui vous intéresse vraiment est ici. Il existe deux façons de rechercher des noeuds imbriqués.
- La première méthode spécifie un chemin explicite de la racine
Le second utilise un caractère générique :**
comme zsh, qui correspond à zéro ou plusieurs répertoires.
; Can search for inner `div` 2 ways
result-1 (find-paths root-hid [:top :group :group]) ; explicit path from root
result-2 (find-paths root-hid [:** :group :item :number]) ; wildcard path that ends in :number
]
Pour tuyaux en fonte (1), nous voyons que nous avons trouvé des éléments seulement 1, 2 et 3:
; Here we see only the double-nested items 1, 2, 3
(is= (spyx-pretty (format-paths result-1))
[[{:tag :top}
[{:tag :group}
[{:tag :group}
[{:tag :item} [{:tag :number, :value "1"}]]
[{:tag :item} [{:tag :number, :value "2"}]]
[{:tag :item} [{:tag :number, :value "3"}]]]]]])
Dans le cas (2), nous avons trouvé non seulement le doublement imbriquée articles, mais aussi l'élément seul imbriquée 0
:
; Here we see both the double-nested items & the single-nested item 0
(is= (spyx-pretty (format-paths result-2))
[[{:tag :top}
[{:tag :group} [{:tag :item} [{:tag :number, :value "0"}]]]]
[{:tag :top}
[{:tag :group}
[{:tag :group} [{:tag :item} [{:tag :number, :value "1"}]]]]]
[{:tag :top}
[{:tag :group}
[{:tag :group} [{:tag :item} [{:tag :number, :value "2"}]]]]]
[{:tag :top}
[{:tag :group}
[{:tag :group} [{:tag :item} [{:tag :number, :value "3"}]]]]]])
)))
vous ne précisaient pas ce que vous en aval traitement nécessaire. Tupelo.Forest
est capable de convertir la sortie en formats hiccup
et enlive
, en plus de son propre format bush
inspiré du hiccup et un format inspiré de tree
.
Refusé pour la bibliothèque vraiment cool (signet!). Malheureusement, j'ai déjà écrit presque tout le projet en utilisant zip-xml et en changeant de chevaux à ce stade serait une douleur. Merci d'avoir pris le temps de partager ces exemples! – BWStearns