2

我在使用HXT时遇到了一点麻烦:我正在尝试在文档中找到与某些条件匹配的所有节点,并且我正在尝试以类似 OR 的方式将 lens/XPaths 组合为谓词,使用Control.Arrow.<+>, 就像这样指南建议。但是,当我尝试“运行”文档上的箭头时,我得到了重复的结果。有没有一种简单的方法可以删除重复项,或者以更有意义的方式组合测试?这是我的代码:

run :: App -> IO ()
run a = do
  inputContents <- readFile (input a)
  let doc = readString [withParseHTML yes, withWarnings no] inputContents
  links <- runX . xshow $ doc >>> indentDoc //> cssLinks
  mapM_ putStrLn links

cssLinks = links >>> (rels <+> hrefs <+> types)
  where
    links = hasName "link"
    rels = hasAttrValue "rel" (isInfixOf "stylesheet")
    hrefs = hasAttrValue "href" (endswith ".css")
    types = hasAttrValue "type" (== "text/css")

然而,每次我运行它(在任何网页上),我都会得到重复的结果/节点。我注意到它<+>ArrowPlus 类型类的一部分,它模仿了一个幺半群,而ArrowXMLArrowListArrowTree的一个实例,这给了我很多工作要做。我是否必须构造ArrowIf谓词?对此的任何帮助都会很棒:)

4

1 回答 1

1

您可以将箭头结果作为 [XmlTree],然后应用 List.nub,然后获取字符串 rep。

import "hxt" Text.XML.HXT.DOM.ShowXml as SX
...

  links <- runX $ doc >>> indentDoc //> cssLinks

  -- first remove duplicates (List.nub) then apply SX.xshow
  putStrLn (SX.xshow . L.nub $ links)
于 2014-06-27T18:28:50.307 回答