どのように私はClojureの中にXMLツリーにジップフィルタクエリからの結果を結合しますか?
-
20-09-2019 - |
質問
私は、XMLツリーに3ジップフィルタのクエリの結果を結合します。私はパース午前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>
が必要です。ここでの私の問題がある - 私は3つの別々のクエリを実行する場合、私が得る応答がお互いに元気外となります:
(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)
私はそのカーディナリティ一致していない3つのシーケンスで残されるこれら三つのクエリを実行した後、私はそれぞれの名前のコンポーネントを組み合わせることのためにこれはそれが不可能given_name
は長さ2になりながらsuffix
とsurname
は、長さが1になります。私は、シーケンスの工事中にこの名前の連結を実行します単一のクエリを記述する必要があります。
私は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)))
での検索結果( "姓A" "姓B、Bが与えられると、サフィックスB")
他のヒント
私は別の解決策は、
にあるとし(xml-> xml :publication :contributors :person_name)
とその後の各<person_name>
を処理します。