x :顶部 :组 :组 :项目( (计数(深项目txml2)) ;; 1. (zip-xml/text(第一个(深层项txml2))) ;; "0",xml,clojure,zipper,Xml,Clojure,Zipper" /> x :顶部 :组 :组 :项目( (计数(深项目txml2)) ;; 1. (zip-xml/text(第一个(深层项txml2))) ;; "0",xml,clojure,zipper,Xml,Clojure,Zipper" />

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-inspired
bush
格式和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"}]]]]]])

      )))