Can';t使用clojure.data.zip.XML访问深度嵌套的XML (def testxml2 " 1. 2. 3. 0 ") (def txml2(zip str testxml2)) (定义深度项目[x] (zip-xml/xml->x :顶部 :组 :组 :项目( (计数(深项目txml2)) ;; 1. (zip-xml/text(第一个(深层项txml2))) ;; "0"
我试图获取内部Can';t使用clojure.data.zip.XML访问深度嵌套的XML (def testxml2 " 1. 2. 3. 0 ") (def txml2(zip str testxml2)) (定义深度项目[x] (zip-xml/xml->x :顶部 :组 :组 :项目( (计数(深项目txml2)) ;; 1. (zip-xml/text(第一个(深层项txml2))) ;; "0",xml,clojure,zipper,Xml,Clojure,Zipper,我试图获取内部:组的值,但它似乎被外部的值抓住了。它似乎忽略了第二个:group 我试图解析的实际XML有一个重复的嵌套Foo模式,我需要单独访问每个Foo。XML来自第三方,因此我不能仅仅重新构造XML来避免这种情况。。对于短版本:版本0.1.2在这方面稍有突破,即不能通过标记=函数(位于:myTag样式选择器下面)选择具有相同名称的子条目。这是由于从0.1.1回归到0.1.2(感谢@bpeter和@shilder)。解决方法是在某个util命名空间中创建一个函数tag=,并直接使用它,直到修
:组的值,但它似乎被外部的值抓住了。它似乎忽略了第二个:group
我试图解析的实际XML有一个重复的嵌套Foo
模式,我需要单独访问每个Foo。XML来自第三方,因此我不能仅仅重新构造XML来避免这种情况。。对于短版本:版本0.1.2在这方面稍有突破,即不能通过标记=
函数(位于:myTag
样式选择器下面)选择具有相同名称的子条目。这是由于从0.1.1回归到0.1.2(感谢@bpeter和@shilder)。解决方法是在某个util命名空间中创建一个函数tag=
,并直接使用它,直到修复回归
(def testxml2
"<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>")
(def txml2 (zip-str testxml2))
(defn deep-items [x]
(zip-xml/xml-> x
:top
:group
:group
:item))
(count (deep-items txml2))
;; 1
(zip-xml/text (first (deep-items txml2)))
;; "0"
您可以使用处理树状数据结构来解决此问题。除了显式搜索外,它还可以使用通配符,如zsh
,但这将让您体验一下您可以做什么:
;; util.clj
(defn tag=
"This is a workaround to a regression in 0.1.2. Fixed in upcoming 1.2.0
Returns a query predicate that matches a node when its is a tag
named tagname."
[tagname]
(fn [loc]
(filter #(and (zip/branch? %) (= tagname (:tag (zip/node %))))
(zf/children-auto loc))))
;; project.somefile.clj
(ns project.somefile
(:require [project.util :as u]))
(defn deep-items [x]
(zip-xml/xml-> x
:top
(u/tag= :group)
(u/tag= :group)
:item))
对于cast(1),我们只找到了项目1、2和3:
; 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
]
对于案例(2),我们不仅找到了双嵌套项,还找到了单嵌套项0
:
; 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"}]]]]]] )
您没有指定所需的下游处理。Tupelo.Forest
能够将输出转换为hiccup
和enlive
格式,加上它自己的hiccup-inspiredbush
格式和enlive-inspired树
格式。被选为真正酷的库(书签!).不幸的是,我已经用zip xml写了几乎整个项目,此时切换马将是一件痛苦的事情。感谢您抽出时间来分享这些示例!
; 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"}]]]]]] )
; 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"}]]]]]])
)))