我试图用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)
请帮忙?
这是一种方法(我的类型更通用,并且我没有使用 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"])\nRun Code Online (Sandbox Code Playgroud)\n\n我可能会运行一个箭头来获取地图,然后进行查找,但这种方式也有效。
\n\n要回答关于listA:的问题divs >>> divs >>> pairs,是一个类型为a XmlTree (String, String)\xe2\x80\x94 的列表箭头,即,它是一个非确定性计算,采用 XML 树并返回字符串对。
arr M.fromList有类型a [(String, String)] (M.Map String String). 这意味着我们不能只用 组合它divs >>> divs >>> pairs,因为类型不匹配。
listA解决了这个问题:它折叠 divs >>> divs >>> pairs成类型为确定性的版本a XmlTree [(String, String)],这正是我们所需要的。
| 归档时间: |
|
| 查看次数: |
1115 次 |
| 最近记录: |