加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用Haskell,如何处理大量的XML?

发布时间:2020-12-16 08:01:02 所属栏目:百科 来源:网络整理
导读:我一直在探索 Stack Overflow data dumps,从而利用友好的XML和“解析”正则表达式。我尝试使用各种Haskell XML库来查找特定用户的文档顺序中的第一个帖子,都是讨厌的。 TagSoup import Control.Monadimport Text.HTML.TagSoupuserid = "83805"main = do po
我一直在探索 Stack Overflow data dumps,从而利用友好的XML和“解析”正则表达式。我尝试使用各种Haskell XML库来查找特定用户的文档顺序中的第一个帖子,都是讨厌的。

TagSoup

import Control.Monad
import Text.HTML.TagSoup

userid = "83805"

main = do
  posts <- liftM parseTags (readFile "posts.xml")
  print $ head $ map (fromAttrib "Id") $
                 filter (~== ("<row OwnerUserId=" ++ userid ++ ">"))
                 posts

hxt

import Text.XML.HXT.Arrow
import Text.XML.HXT.XPath

userid = "83805"

main = do
  runX $ readDoc "posts.xml" >>> posts >>> arr head
  where
    readDoc = readDocument [ (a_tagsoup,v_1),(a_parse_xml,(a_remove_whitespace,(a_issue_warnings,v_0),(a_trace,v_1)
                           ]

posts :: ArrowXml a => a XmlTree String
posts = getXPathTrees byUserId >>>
        getAttrValue "Id"
  where byUserId = "/posts/row/@OwnerUserId='" ++ userid ++ "'"

xml

import Control.Monad
import Control.Monad.Error
import Control.Monad.Trans.Maybe
import Data.Either
import Data.Maybe
import Text.XML.Light

userid = "83805"

main = do
  [posts,votes] <- forM ["posts","votes"] $
    liftM parseXML . readFile . (++ ".xml")
  let ps = elemNamed "posts" posts
  putStrLn $ maybe "<not present>" show
           $ filterElement (byUser userid) ps

elemNamed :: String -> [Content] -> Element
elemNamed name = head . filter ((==name).qName.elName) . onlyElems

byUser :: String -> Element -> Bool
byUser id e = maybe False (==id) (findAttr creator e)
  where creator = QName "OwnerUserId" Nothing Nothing

我哪里做错了?使用Haskell处理大量XML文档的正确方法是什么?

我注意到在所有这些情况下你都在做String IO。您绝对必须使用Data.Text或Data.Bytestring(.Lazy),如果您希望有效地处理大量的文本,String = [Char],这是非常大的平面文件的不适当的表示。

那就意味着你需要使用支持bytestrings的Haskell XML库。几十个xml库在这里:http://hackage.haskell.org/packages/archive/pkg-list.html#cat:xml

我不知道哪些支持bytestrings,但这是你正在寻找的条件。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读