developer tip

Clojure XML 구문 분석

copycodes 2020. 11. 17. 08:19
반응형

Clojure XML 구문 분석


xml 문서를 구문 분석하고 요소에 액세스하는 방법에 대한 정보를 찾을 수 없습니다.

xml 문서를 구문 분석하는 두 가지 방법을 찾았습니다.

(clojure.zip/xml-zip (clojure.xml/parse file))

(parse-seq file)

하지만 결과 구조를 처리하는 방법에 대한 정보를 찾을 수 있습니까?

소스 파일은 결과를 쿼리하는 방법에 대한 zip-query.clj를 참조하지만 누락 된 것 같습니다.


파일에서 구문 분석 할 다음 xml이 있다고 가정합니다.

<high-node>
   <low-node>my text</low-node>
</high-node>

로드 clojure.xml:

user=> (use 'clojure.xml)

구문 분석 될 때 xml은 다음 구조를 갖습니다.

{:tag :high-node, :attrs nil, :content [{:tag :low-node, :attrs nil, :content ["my text"]}]}

그런 다음 파일의 내용을 seq하여 다음 내용을 가져올 수 있습니다 low-node.

user=> (for [x (xml-seq 
              (parse (java.io.File. file)))
                 :when (= :low-node (:tag x))]
         (first (:content x)))

("my text")

마찬가지로 하위 노드의 전체 정보 목록에 액세스하려면 :when조건자를 (= (:high-node (:tag x)))다음과 같이 변경합니다 .

user=> (for [x (xml-seq 
              (parse (java.io.File. file)))
                 :when (= :high-node (:tag x))]
         (first (:content x)))

({:tag :low-node, :attrs nil, :content ["my text"]})

이것은 키워드가 기능으로 작동 할 수 있기 때문에 작동합니다. Clojure데이터 구조 : 키워드 에서 목록 및 기타 항목 에 대한 질문 보기


위의 답변은 작동하지만 clojure.data.zip.xml사용하기가 훨씬 쉽습니다 ( clojure-contrib.zip-filter.xmlClojure 1.3 이전에 사용됨 ).

파일:

myfile.xml:

<songs>
  <track id="t1"><name>Track one</name></track>
  <track id="t2"><name>Track two</name></track>
</songs>

암호:

; Clojure 1.3
(ns example
  (:use [clojure.data.zip.xml :only (attr text xml->)]) ; dep: see below
  (:require [clojure.xml :as xml]
            [clojure.zip :as zip]))

(def xml (xml/parse "myfile.xml"))
(def zipped (zip/xml-zip xml))
(xml-> zipped :track :name text)       ; ("Track one" "Track two")
(xml-> zipped :track (attr :id))       ; ("t1" "t2")

안타깝게도이 멋진 읽기 / 필터 기능을 얻으려면 data.zip 에 대한 종속성을 가져와야 합니다. 의존 할 가치가 있습니다. :) lein 에서는 다음과 같습니다 (2013 년 8 월 17 일 기준).

[org.clojure/data.zip "0.1.1"]

그리고에 대한 문서에 관해서는 ... 가능한 것이 무엇인지 확인하기 위해 data.zip.xml상대적으로 작은 소스 파일을 여기 에서 살펴 봅니다. 여기에 또 다른 좋은 대답 도 있습니다.

참고URL : https://stackoverflow.com/questions/1194044/clojure-xml-parsing

반응형