2011-07-01 10 views
5

से डेटा प्राप्त करना मैं एचएफटी का उपयोग करते हुए 6 लाइनों के साथ एक एक्सएमएल इनपुट से कुछ डेटा निकालने का प्रयास कर रहा हूं। मैं कर्ल एकीकरण के कारण भी एचएफटी रखना चाहता हूं और क्योंकि मेरे पास अन्य एक्सएमएल फाइलें हैं जो बाद में हजारों लाइनों के साथ हैं।एक साधारण एक्सएमएल

मेरे एक्सएमएल इस तरह दिखता है:

<?xml version = "1.0" encoding = "UTF-8"?> 
<find> 
    <set_number>228461</set_number> 
    <no_records>000000008</no_records> 
    <no_entries>000000008</no_entries> 
</find> 

और मैं एक साथ पाने के लिए है कि पार्स करने के लिए कैसे की कोशिश कर रहा हूँ। दुर्भाग्यवश, एचएफटी का विकी पेज एक बड़ी मदद नहीं रहा है (या मैंने अभी सामानों को नजरअंदाज कर दिया है)।

data FindResult = FindResult { 
     resultSetNumber :: String, 
     resultNoRecords :: Int, 
     resultNoEntries :: Int 
    } deriving (Eq, Show) 

resultParser :: ArrowXml a => a XmlTree FindResult 
resultParser = hasName "find" >>> getChildren >>> proc x -> do 
    setNumber <- isElem >>> hasName "set_number" >>> getChildren >>> getText -< x 
    noRecords <- isElem >>> hasName "no_records" >>> getChildren >>> getText -< x 
    noEntries <- isElem >>> hasName "no_entries" >>> getChildren >>> getText -< x 
    returnA -< FindResult setNumber (read noRecords) (read noEntries) 

find str = return . head =<< (runX $ readDocument [withValidate no, withCurl []] query >>> resultParser) 
    where query = "http://" ++ server ++ "/find?request=" ++ str 

क्या मैं हमेशा पाने के बाद से मैं जाँच की तो, मुझे लगता है, पार्स बहुत गलत हो जाना चाहिए, और सही ढंग से क्वेरी से XML मिल

*** Exception: Prelude.head: empty list 

है।

उत्तर

6

मेरे लिए निम्नलिखित काम करता है (this example बाद मॉडल निर्मित):

{-# LANGUAGE Arrows #-} 

module Main 
     where 

import Text.XML.HXT.Core 
import System.Environment 

data FindResult = FindResult { 
     resultSetNumber :: String, 
     resultNoRecords :: Int, 
     resultNoEntries :: Int 
    } deriving (Eq, Show) 

resultParser :: ArrowXml a => a XmlTree FindResult 
resultParser = 
    deep (isElem >>> hasName "find") >>> proc x -> do 
    setNumber <- getText <<< getChildren <<< deep (hasName "set_number") -< x 
    noRecords <- getText <<< getChildren <<< deep (hasName "no_records") -< x 
    noEntries <- getText <<< getChildren <<< deep (hasName "no_entries") -< x 
    returnA -< FindResult setNumber (read noRecords) (read noEntries) 

main :: IO() 
main = do [src] <- getArgs 
      res <- runX $ (readDocument [withValidate no] src >>> resultParser) 
      print . head $ res 

परीक्षण:

$ dist/build/test/test INPUT 
FindResult {resultSetNumber = "228461", resultNoRecords = 8, resultNoEntries = 8} 
+0

आप के लिए बहुत-बहुत धन्यवाद! – Lanbo