我在使用HXT时遇到了一些麻烦:我正在尝试找到符合某些条件的文档中的所有节点,并且我尝试将镜头/ XPath组合为谓词以类似OR的方式,使用Control.Arrow.<+>
,this guide建议。但是,当我试图&#34;运行&#34;我的文档上的箭头,我得到重复的结果。是否有一种简单的方法可以删除重复项,或以更有意义的方式组合测试?这是我的代码:
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 typeclass的一部分,它模仿了一个幺半群,ArrowXML是ArrowList和ArrowTree的一个实例,它给了我一个很多工作。我是否必须构建ArrowIf谓词?任何有关这方面的帮助都会很精彩:)
答案 0 :(得分: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)