使用xml-conduit执行不区分大小写的标记和属性名称匹配的最佳方法是什么
例如,考虑上的findNodes解析示例中的函数:
-- The data we're going to search for
findNodes :: Cursor -> [Cursor]
findNodes = element "span" >=> attributeIs "class" "sb_count" >=> child(我已经修改了这一行,使其能够与Bing当前的页面结构一起工作。)
我的实验表明,element和attributeIs在匹配名称时不执行不区分大小写的比较.有什么简单的方法来改变这种状况吗?
发布于 2014-08-16 20:30:14
在匹配元素时,可以使用laxElement忽略大小写。它还将忽略名称空间。在checkName上编写一个包装器应该非常容易,它具有您要寻找的确切语义。
发布于 2014-08-16 04:42:13
我找到了一个解决办法.仍然对更清洁的解决方案感兴趣。
基本上,我们只是创建我们自己版本的Text.HTML.DOM,它在创建XML树之前修复标记事件流中的标记和属性名称。
函数eventConduit的开头如下:
eventConduit :: Monad m => Conduit S.ByteString m XT.Event
eventConduit =
TS.tokenStream =$= go []
where
go stack = do
mx <- await
case fmap (entities . fmap' (decodeUtf8With lenientDecode)) mx of
Nothing -> closeStack stack
...我们将case fmap ...行更改为:
case fmap (entities . fixNames . fmap' (decodeUtf8With lenientDecode)) mx of其中fixNames被定义为:
fixNames :: TS.Token' Text -> TS.Token' Text
fixNames (TS.TagOpen x pairs b) = TS.TagOpen (T.toLower x) (map (T.toLower *** id) pairs) b
fixNames (TS.TagClose x) = TS.TagClose (T.toLower x)
fixNames t = t现在,我们只在element和attributeIs中使用小写名称。
https://stackoverflow.com/questions/25336453
复制相似问题