Haskell HXT用于提取值列表

Muc*_*hin 5 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>
Run Code Online (Sandbox Code Playgroud)

我已经提取到HXT XmlTree中了.我想做的是定义一个函数(我想?):

getValues :: [String] -> IOSArrow Xmltree [(String, String)]
Run Code Online (Sandbox Code Playgroud)

哪个,如果用作getValues ["c1", "c2", "c3", "c4"],将得到我:

[("c1", "a"), ("c2", "b"), ("c3", "123"), ("c4", "234")]
Run Code Online (Sandbox Code Playgroud)

请帮忙?

Tra*_*own 3

这是一种方法(我的类型更通用,并且我没有使用 XPath):

\n\n
{-# LANGUAGE Arrows #-}\nmodule Main where\n\nimport qualified Data.Map as M\nimport Text.XML.HXT.Arrow\n\nclasses :: (ArrowXml a) => a XmlTree (M.Map String String)\nclasses = listA (divs >>> divs >>> pairs) >>> arr M.fromList\n  where\n    divs = getChildren >>> hasName "div"\n    pairs = proc div -> do\n      cls <- getAttrValue "class" -< div\n      val <- deep getText         -< div\n      returnA -< (cls, val)\n\ngetValues :: (ArrowXml a) => [String] -> a XmlTree [(String, Maybe String)]\ngetValues cs = classes >>> arr (zip cs . lookupValues cs)\n  where lookupValues cs m = map (flip M.lookup m) cs\n\nmain = do\n  let xml = "<div><div class=\'c1\'>a</div><div class=\'c2\'>b</div>\\\n            \\<div class=\'c3\'>123</div><div class=\'c4\'>234</div></div>"\n\n  print =<< runX (readString [] xml >>> getValues ["c1", "c2", "c3", "c4"])\n
Run Code Online (Sandbox Code Playgroud)\n\n

我可能会运行一个箭头来获取地图,然后进行查找,但这种方式也有效。

\n\n
\n\n

要回答关于listA:的问题divs >>> divs >>> pairs,是一个类型为a XmlTree (String, String)\xe2\x80\x94 的列表箭头,即,它是一个非确定性计算,采用 XML 树并返回字符串对。

\n\n

arr M.fromList有类型a [(String, String)] (M.Map String String). 这意味着我们不能只用 组合它divs >>> divs >>> pairs,因为类型不匹配。

\n\n

listA解决了这个问题:它折叠 divs >>> divs >>> pairs成类型为确定性的版本a XmlTree [(String, String)],这正是我们所需要的。

\n