code

클로저 XML 구문 분석

starcafe 2023. 10. 30. 21:09
반응형

클로저 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"]}]}

파일의 내용을 조회하여 파일의 내용을 얻을 수 있습니다.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"]})

이것은 키워드가 함수로 작동할 수 있기 때문에 작동합니다.ClojureData Structures목록기타 항목에 대한 질문을 참조하십시오. 키워드

위의 답변은 효과가 있지만, 사용하기가 훨씬 쉽다고 생각합니다.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에 대한 종속성을 적용해야 합니다.의존할 가치가 있습니다 :) Inline은 (2013년 8월 17일 기준):

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

그리고 문서에 관해서는data.zip.xml... 저는 무엇이 가능한지 여기서 비교적 작은 소스 파일만 보고 있습니다.여기에 또 다른 좋은 SO 답변도 있습니다.

언급URL : https://stackoverflow.com/questions/1194044/clojure-xml-parsing

반응형