2010-01-13 10 views
8

मैं एक 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) 

इन तीन प्रश्नों मैं तीन दृश्यों जिसका cardinalities मेल नहीं खाते के साथ छोड़ दिया जाएगा चलाने के बाद; given_name और suffix लंबाई 1 होगा जबकि surname लंबाई 2 होगी। यह मेरे लिए प्रत्येक नाम के घटकों को गठबंधन करना असंभव बनाता है। मुझे एक भी प्रश्न लिखने की ज़रूरत है जो अनुक्रम निर्माण के दौरान इस नाम को समापन करेगी।

मैं clojure.contrib.zip-filter.xml के लिए बहुत ही कम दस्तावेज देख रहा हूं और यह नहीं समझ सकता कि मैं यह कैसे कर सकता हूं (या यदि यह भी संभव है)। दुर्भाग्य से मैं एक क्लोजर (और लिस्प) नौसिखिया हूँ! क्या कोई यह बता सकता है कि मैं एक प्रश्न कैसे लिख सकता हूं जो तीन अन्य एम्बेडेड प्रश्नों को जोड़ देगा?

+1

चेक इस हाल अतः बाहर सवाल: http://stackoverflow.com/questions/2034550/लौटने-बहु-मान-का उपयोग कर-clojure-एक्सएमएल-ज़िपर –

उत्तर

6

आप सभी व्यक्ति subtrees एक चरण (xml-> xmlzip: प्रकाशन: योगदानकर्ता: person_name) प्राप्त कर सकते हैं, तो यदि वे मौजूद हैं (xml1-> personzip: surname text) तो नाम भाग प्राप्त करें और परिणामस्वरूप उन्हें गठबंधन करें इसलिए जैसे हैं:

में
(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))) 

परिणाम ("उपनाम एक" "उपनाम बी, बी को देखते हुए, प्रत्यय बी")

2

मुझे लगता है कोई वैकल्पिक समाधान है

(xml-> xml :publication :contributors :person_name) 

और फिर बाद में प्रत्येक <person_name> की प्रक्रिया।