Используйте для понимания , это приводит к ленивым последовательностям.
Вот код для вас.Я нашел время, чтобы запустить его в командной строке;вам нужно только заменить имя проанализированного XML-файла.
Предупреждение 1: избегайте определения переменных.Вместо этого используйте локальные переменные.
Предупреждение 2: это Java API для XML, поэтому объекты могут изменяться;поскольку у вас есть ленивая последовательность, если какие-либо изменения произойдут с изменяемым DOM-деревом во время итерации, у вас могут возникнуть неприятные изменения расы.
Предупреждение 3: , даже если это ленивыйструктура, все дерево DOM уже находится в памяти в любом случае (хотя я не совсем уверен в этом последнем комментарии, хотя. Я думаю, что API пытается отложить чтение дерева в памяти до необходимости, но без гарантий) .Поэтому, если у вас возникнут проблемы с большими XML-документами, старайтесь избегать подхода DOM.
(require ['clojure.java.io :as 'io])
(import [javax.xml.parsers DocumentBuilderFactory])
(import [org.xml.sax InputSource])
(def dbf (DocumentBuilderFactory/newInstance))
(doto dbf
(.setValidating false)
(.setNamespaceAware true)
(.setIgnoringElementContentWhitespace true))
(def builder (.newDocumentBuilder dbf))
(def doc (.parse builder (InputSource. (io/reader "C:/workspace/myproject/pom.xml"))))
(defn lazy-child-list [element]
(let [nodelist (.getChildNodes element)
len (.getLength nodelist)]
(for [i (range len)]
(.item nodelist i))))
;; To print the children of an element
(-> doc
(.getDocumentElement)
(lazy-child-list)
(println))
;; Prints clojure.lang.LazySeq
(-> doc
(.getDocumentElement)
(lazy-child-list)
(class)
(println))