作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试同时使用 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"])
我可能会运行一个箭头来获取 map ,然后进行查找,但这种方式也很有效。
要回答有关 listA
的问题:divs >>> divs >>> pairs
是类型为 a XmlTree (String, String)< 的列表箭头
——也就是说,它是一种非确定性计算,它采用 XML 树并返回字符串对。
arr M.fromList
具有类型a [(String, String)] (M.Map String String)
。这意味着我们不能只用 divs >>> div >>> pairs
组合它,因为类型不匹配。
listA
解决了这个问题:它折叠 divs >>> divs >>> pairs
为类型为 a 的确定性版本XmlTree [(String, String)]
,这正是我们所需要的。
关于xml - 用于提取值列表的 Haskell HXT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3897283/
我是一名优秀的程序员,十分优秀!