【发布时间】:2018-05-08 14:49:43
【问题描述】:
如何使用 Clojure 拉链过滤 XML 中的文本节点?例如,您可能有一个打印精美的 XML 文档,该文档将元素节点与包含空格的文本节点交错:
(def doc
"<?xml version=\"1.0\"?>
<root>
<a>1</a>
<b>2</b>
</root>")
如果你想检索root的孩子的内容,你可以这样做:
(require '[clojure.data.xml :as xml]
'[clojure.zip :as zip]
'[clojure.data.zip :as zf]
'[clojure.data.zip.xml :as zip-xml])
(-> doc
xml/parse-str
zip/xml-zip
(zip-xml/xml-> :root zf/children zip-xml/text))
但是,这会返回 (" " "1" " " "2" " "),包括空格。
如何过滤拉链,只选择元素节点?
我想出了这个。
(def filter-elements (comp (partial filter (comp xml/element? zip/node)) zf/children))
(-> doc
xml/parse-str
zip/xml-zip
(zip-xml/xml-> :root filter-elements zip-xml/text))
; => ("1" "2")
我怀疑它过于复杂,因此我正在寻找更好的解决方案。
【问题讨论】: