gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 01:58:45 28 4
gpt4 key购买 nike

我正在尝试同时使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com