hxt-9.1.0: A collection of tools for processing XML with Haskell. とか no title を見ながらがんばる.
コンセプトは HaXml と同様にフィルタの組み合わせなんだけど,読み込みや書き込みも含めてすべて Arrow で繋げる.
IO を伴わない場合は [State]ListArrow ([S]LA),伴う場合は IO[State]ListArrow (IO[S]LA) を使うかんじでいいのかな.
引数として与えた screen_name のユーザのふぁぼり最新20をいいかんじに table に変換して出力するもの書いた.
それぞれのユーザ毎に API 1つ消費.
toString とか prepare とか醜い…
import Prelude hiding (id) import Control.Monad (forM_) import System.Environment (getArgs) import qualified System.IO.UTF8 as U import Text.XML.HXT.Arrow import Data.Tree.NTree.TypeDefs (NTree) data Status = S {text :: String, id :: String, name :: String, imgurl :: String} toString :: LA [a] XmlTree -> String toString a = head $ runLA (selem "dummy" [a] >>> xshow getChildren) [] main = do users <- getArgs forM_ users $ \u -> do elems <- runX $ readDocument [] ("http://twitter.com/favorites/" ++ u ++ ".xml") >>> deep (isElem >>> hasName "status") putStrLn "<table border=\"1\" bgcolor=\"#FFFFFF\">" mapM_ (U.putStrLn . toString . prepare . parse) elems putStrLn "</table>" parse :: NTree XNode -> Status parse s = let get e n = head $ runLA (getChildren >>> hasName n >>> getChildren >>> getText) e [text, id] = map (get s) ["text", "id"] [name, imgurl] = map (get (head $ runLA (getChildren >>> hasName "user") s)) ["screen_name", "profile_image_url"] in S text id name imgurl prepare :: (ArrowXml a) => Status -> a n XmlTree prepare s = mkelem "tr" [sattr "width" "32", sattr "height" "32"] [ mkelem "td" [sattr "width" "32", sattr "height" "32"] [mkelem "img" [sattr "src" (imgurl s), sattr "width" "32", sattr "height" "32"] []] , selem "td" [mkelem "a" [sattr "href" ("http://twitter.com/" ++ name s)] [txt (name s)]] , selem "td" [txt (text s)] , selem "td" [mkelem "a" [sattr "href" ("http://twitter.com/" ++ name s ++ "/status/" ++ id s)] [txt "link"]]]