6

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

请帮忙?

4

3 回答 3

3

这是一种方法(我的类型更通用,我没有使用 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是一个带有类型的列表箭头a XmlTree (String, String)——即,它是一种非确定性计算,它采用 XML 树并返回字符串对。

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

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

于 2010-10-09T19:21:39.157 回答
0

这是使用HandsomeSoup的一种方法:

-- For the join function.
import Data.String.Utils
import Text.HandsomeSoup
import Text.XML.HXT.Core

-- Of each element, get class attribute and text.
getItem = (this ! "class" &&& (this /> getText))  
getItems selectors = css (join "," selectors) >>> getItem

main = do
  let selectors = [".c1", ".c2", ".c3", ".c4"]
  items <- runX (readDocument [] "data.html" >>> getItems selectors)
  print items

data.html 是 HTML 文件。

于 2012-11-04T00:48:59.723 回答
0

尽管现在距离原始帖子已有 10 年了,但这仍然是非常有用的建议。

对于其他在 2020 年坚持使用 Haskell XML 处理的人,我可以确认第一个示例在以下系统上运行良好:

ghci --version Glorious Glasgow Haskell 编译系统,版本 8.8.4

Mac OS Catalina (10.15.7)

非常感谢您帮助我 - 它为我节省了很多时间。

于 2020-12-03T20:49:10.993 回答