나는 html/xml 데이터 구조를 걷고있다. 나는 clojure.zip
을 사용하여 그것을 걸어 간다. cut
(가지 치기)를 원하는 노드를 찾으면 모든 자식 노드와 오른쪽 노드를 제거 할 수있는 방법을 찾을 수 없습니다.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
지점까지 복사하는 방법을 환영합니다.
예 데이터 : 그리고이 같은 내용을 얻기 위해 그것을 통해 걷고
{: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}]}]}
시작 : 이것은 내가 xml-zip
를 호출하는 내가 위의 나무에 대한이 분석 된 데이터입니다
(-> 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