所以我需要阅读一个大的 XML 文件。我不想将其解析为 DOM 树并将其全部保存在内存中。我宁愿寻找的是一种阅读器,它提供对 Haskell 中 XML 数据的快速、非缓存、只进的访问。
编辑:似乎有一些关于同一主题的问题,但是我没有在那里找到答案。所以我要再次寻找的是:
- 一个 XML 游标(快速、单向、无惰性、无缓存、随用随处理)库
- 一个如何使用它的例子。
编辑: Text.XML.Enumerator.Parse 似乎是答案:这是一个不错的选择吗?
我用于类似任务的最佳模块是xml -conduit包中的Text.XML.Stream.Parse 。模块索引包含这个简单的 API 示例:
{-# LANGUAGE OverloadedStrings #-}
import Control.Monad.Trans.Resource
import Data.Conduit (($$))
import Data.Text (Text, unpack)
import Text.XML.Stream.Parse
data Person = Person Int Text
deriving Show
parsePerson = tagName "person" (requireAttr "age") $ \age -> do
name <- content
return $ Person (read $ unpack age) name
parsePeople = tagNoAttr "people" $ many parsePerson
main = do
people <- runResourceT $
parseFile def "people.xml" $$ force "people required" parsePeople
print people