xml – 用于提取值列表的Haskell HXT
发布时间:2020-12-16 23:30:42 所属栏目:百科 来源:网络整理
导读:我试图用XPath和箭头同时通过HXT来解决问题,我完全坚持如何思考这个问题.我有以下 HTML: divdiv class="c1"a/div div class="c2"b/div div class="c3"123/div div class="c4"234/div /div 我已经提取到HXT XmlTree中了.我想做的是定义一个函数(我想?): ge
我试图用XPath和箭头同时通过HXT来解决问题,我完全坚持如何思考这个问题.我有以下
HTML:
<div> <div class="c1">a</div> <div class="c2">b</div> <div class="c3">123</div> <div class="c4">234</div> </div> 我已经提取到HXT XmlTree中了.我想做的是定义一个函数(我想?): getValues :: [String] -> IOSArrow Xmltree [(String,String)] 其中,如果用作getValues [“c1”,“c2”,“c3”,“c4”],将会得到: [("c1","a"),("c2","b"),("c3","123"),("c4","234")] 请帮忙? 解决方法
这是一种方法(我的类型更通用,我不使用XPath):
{-# LANGUAGE Arrows #-} module Main where import qualified Data.Map as M import Text.XML.HXT.Arrow classes :: (ArrowXml a) => a XmlTree (M.Map String String) classes = listA (divs >>> divs >>> pairs) >>> arr M.fromList where divs = getChildren >>> hasName "div" pairs = proc div -> do cls <- getAttrValue "class" -< div val <- deep getText -< div returnA -< (cls,val) getValues :: (ArrowXml a) => [String] -> a XmlTree [(String,Maybe String)] getValues cs = classes >>> arr (zip cs . lookupValues cs) where lookupValues cs m = map (flip M.lookup m) cs main = do let xml = "<div><div class='c1'>a</div><div class='c2'>b</div> &;div class='c3'>123</div><div class='c4'>234</div></div>" print =<< runX (readString [] xml >>> getValues ["c1","c2","c3","c4"]) 我可能会运行一个箭头来获取地图,然后进行查找,但这种方式也可以. 要回答有关listA的问题:divs>>> divs>>> pairs是一个列表箭头,类型为XmlTree(String,String)-i.e.,它是一个非确定性计算,它采用XML树并返回字符串对. arr M.fromList具有类型a [(String,String)](M.Map String String).这意味着我们不能只用divs>>>组成它. divs>>>对,因为类型不匹配. listA解决了这个问题:它折叠了divs>>> divs>>>成对一个类型为XmlTree [(String,String)]的确定性版本,这正是我们所需要的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |