du the Tupelo Forest library mit lösen zu verarbeiten Baum-ähnliche Datenstrukturen.Neben der expliziten Suche kann es auch Wildcards wie zsh
. Documentation is ongoing verwenden, aber das wird Ihnen einen Vorgeschmack geben, was Sie tun können:
(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
Der Teil, um den Sie sich wirklich kümmern, ist hier. Es gibt zwei Möglichkeiten, nach verschachtelten Knoten zu suchen.
- Die erste Methode spezifiziert einen expliziten Pfad von der Wurzel
der zweite ein Wildcard :**
wie zsh verwendet, die keine oder mehrere Verzeichnisse übereinstimmt.
; 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
]
Für Guss- (1), sehen wir, dass wir nur die Artikel 1, 2 und 3 gefunden:
; 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"}]]]]]])
Für den Fall (2), fanden wir nicht nur die doppelt verschachtelten Artikel, sondern auch die einzeln verschachtelte Artikel 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"}]]]]]])
)))
Sie nicht angeben, was man benötigt Downstream Processing. Tupelo.Forest
ist in der Lage, Ausgabe in beide hiccup
und enlive
Formate zu konvertieren, und es ist eigene hiccup-inspirierte bush
Format und eine belebende inspirierte tree
Format.
Upvoted für wirklich coole Bibliothek (Lesezeichen!). Leider habe ich schon fast das gesamte Projekt mit zip-xml ausgeschrieben und die Pferde an dieser Stelle zu wechseln wäre eine Qual. Danke, dass Sie sich die Zeit genommen haben, diese Beispiele zu teilen! – BWStearns