나는 어떻게 결합한 결과에 지퍼 쿼리를 필터링에 xml 트리에 Clojure?
-
20-09-2019 - |
문제
내가 원하는 결과를 결합의 세퍼 쿼리를 필터링에 xml 나무입니다.XML 나는 구문 분석은 다음과 같다:
<someroot>
<publication>
<contributors>
<person_name>
<surname>Surname A</surname>
</person_name>
<person_name>
<given_name>Given B</given_name>
<surname>Surname B</surname>
<suffix>Suffix B</suffix>
</person_name>
</contributors>
</publication>
</someroot>
이 예시에서 볼 수 있는 <given_name>
고 <suffix>
선택 사항만 <surname>
이 필요합니다.여기에 거짓말을 내 문제가-실행하는 경우 세 가지 별도의 쿼리를 응답을 얻을 것이 호조와 함께 각 기타:
(xml-> xml :publication :contributors :person_name :given_name text)
(xml-> xml :publication :contributors :person_name :surname text)
(xml-> xml :publication :contributors :person_name :suffix text)
후 실행하는 이러한 세 가지 쿼리가 남아 있을 것입니다 세 개의 시퀀스 카디널리티 일치하지 않; given_name
고 suffix
될 것입니다 길이 1 안 surname
될 것입니다 길이 2 개.이것은 불가능한 결합 구성 요소 각각의 이름입니다.나를 작성해야 하나의하는 쿼리를 수행합니다 이 이름을 연결하는 동안 순서 건설입니다.
내가 찾는 것에는 매우 희박에 대한 문서 clojure.contrib.zip-filter.xml
와는 방법을 알아낼 수 없습니다 내가 이렇게 할 수 있다(경우 또는 그것도 가능).불행하게도 나는 Clojure(및 Lisp)초보자!할 수 있는 사람을 지적할 수 있는 방법을 작성하는 쿼리를 연결합니다 세 개의 다른 임베디드 쿼리가?
해결책
당신이 얻을 수 있는 모든 사람이 하위 트리에서 한 단계(xml>xmlzip:출판:참가자:person_name)그 이름을 얻는 부분을 그들이 존재하는 경우(xml1->personzip:성 텍스트)및 그들을 결합하여 원하는 결과 같이:
(use 'clojure.contrib.zip-filter.xml)
(defn format-name
[surname given suffix]
(str surname (if given (str ", " given)) (if suffix (str ", " suffix))))
(defn get-names
[xz]
(map (juxt
#(xml1-> % :surname text)
#(xml1-> % :given_name text)
#(xml1-> % :suffix text))
(xml-> xz :publication :contributors :person_name)))
(let [x (clojure.zip/xml-zip (clojure.xml/parse "foo.xml"))]
(map (partial apply format-name) (get-names x)))
결과에서("성서""성 B,주어진 B,B 접미사")
다른 팁
내 생각 대체 솔루션
(xml-> xml :publication :contributors :person_name)
다음 각 과정 <person_name>
니다.