Учитывая пространство имен xml (игнорируется в этом примере)
<foo>
<name>John</name>
<address>1 hacker way</address>
<phone></phone>
<school>
<name></name>
<state></state>
<type></type>
</school>
<college>
<name>mit</name>
<address></address>
<state></state>
</college>
</foo>
как бы вы написали функцию, remove-empty-tags
с clojure.data.xml , чтобы вернуть следующее?
<foo>
<name>John</name>
<address>1 hacker way</address>
<college>
<name>mit</name>
</college>
</foo>
Мое решение до сих пор не завершено и похоже, что некоторая рекурсия может помочь:
(require '[clojure.data.xml :as xml])
(defn- child-element? [e]
(let [content (:content e)]
(and (= (count content)
(count (filter #(instance? clojure.data.xml.node.Element %) content))))))
(defn remove-empty-tags
[xml-data]
(let [empty-tags? #(or (empty? %) (-> % .toString blank?))]
(reduce (fn [col e]
(if-not (empty-tags? (:content e))
(merge col e)
col)))
xml-data))
(def body (slurp "sample.xml")) ;; the above xml
(def xml-data (-> (xml/parse (java.io.StringReader. body)) :content))
(remove-empty-tags xml-data)
Возвращается после преобразования в xml:
<foo>
<name>John</name>
<address>1 hacker way</address>
<school>
<name/>
<state/>
</school>
<college>
<name>mit</name>
<address/>
<state/>
</college>
</foo>
Очевидно,эта функция должна быть рекурсивной для удаления пустых дочерних узлов, используя child-element?
.
Предложения?