[英]How do I combine results from zip-filter queries on an xml tree in Clojure?
我想在xml樹上結合三個zip-filter查詢的結果。 我正在解析的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:publication:contributors:person_name)然后獲取名稱部分(如果它們存在(xml1-> personzip:surname文本)並將它們組合到您想要的結果中:
(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)))
結果(“姓氏A”“姓氏B,給定B,后綴B”)
我想另一種解決方案是
(xml-> xml :publication :contributors :person_name)
然后再處理每個<person_name>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.