我走的是html/xml数据结构。我使用clojure.zip
来穿过它。一旦找到我想要的节点(修剪),我找不到一种方法来删除所有的孩子和正确的节点。Clojure XML拉链走路和修剪
例子:
比方说,我有这样的树(表示HTML):
(def tree [:p "F"
[:p "G" [:p "I" [:p "H"]]]
[:p "B"
[:p
"D"
[:p "E"]
[:p "C"]]
[:p "A"]]])
我解析它,xml-zip
它,并在某些时候边走边我在节点落得“ D“,我想要剪切。我现在需要返回没有“E”,“C”(儿童)和“D”的根。这些都是在此时使用next
时尚未访问的所有节点。
我将如何删除这些节点?
注意:如果这不可行,我也欢迎一种方法,将拉链复制到cut
点。
示例数据:这是在分析数据,我对上面的树,在我称之为xml-zip
:
{:tag :html, :attrs nil, :content [{:tag :head, :attrs nil, :content nil} {:tag :body, :attrs nil, :content [{:tag :p, :attrs nil, :content ["F"]} {:tag :p, :attrs nil, :content ["G"]} {:tag :p, :attrs nil, :content ["I"]} {:tag :p, :attrs nil, :content ["H"]} {:tag :p, :attrs nil, :content nil} {:tag :p, :attrs nil, :content nil} {:tag :p, :attrs nil, :content ["B"]} {:tag :p, :attrs nil, :content ["D"]} {:tag :p, :attrs nil, :content ["E"]} {:tag :p, :attrs nil, :content ["C"]} {:tag :p, :attrs nil, :content nil} {:tag :p, :attrs nil, :content ["A"]} {:tag :p, :attrs nil, :content nil} {:tag :p, :attrs nil, :content nil}]}]}
我开始通过它走起路来像这样得到的内容:
(-> parsed (z/xml-zip)
(z/down) ;head
(z/right) ; body
(z/down) ; content
)
又如:
以下字符串:"<article><h1><img href=\"some-url\"></img> some-text <b>in bold</b></h1><ul><li> AA </li> <li>BB</li></ul></article>"
会给我下面的图:在“一些文本”切割时
[{:tag :html, :attrs nil, :content [{:tag :head, :attrs nil, :content nil} {:tag :body, :attrs nil, :content [{:tag :article, :attrs nil, :content [{:tag :h1, :attrs nil, :content [{:tag :img, :attrs {:href "some-url"}, :content nil} " some-text " {:tag :b, :attrs nil, :content ["in bold"]}]} {:tag :ul, :attrs nil, :content [{:tag :li, :attrs nil, :content [" AA "]} " " {:tag :li, :attrs nil, :content ["BB"]}]}]}]}]} nil]
应该最终导致字符串中的所有的<article><h1><img href=\"some-url\"></img> some-text</h1></article>
你可以利用https://clojuredocs.org/clojure.zip/remove去除节点和相关的子树用它。 – Grav
@Grav它删除节点,但似乎并没有删除与之相关的子树。 – nha
(即使它的确如此,在我的示例中,A不是D的子树的一部分) – nha