微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

xml – 用于提取值列表的Haskell HXT

我试图用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)]的确定性版本,这正是我们所需要的.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。