如果我有这样的XML文档:
<root>
<elem name="Greeting">
Hello
</elem>
<elem name="Name">
Name
</elem>
</root>
Run Code Online (Sandbox Code Playgroud)
和一些像这样的Haskell类型/数据定义:
type Name = String
type Value = String
data LocalizedString = LS Name Value
Run Code Online (Sandbox Code Playgroud)
我想用以下签名编写Haskell函数:
getLocalizedStrings :: String -> [LocalizedString]
Run Code Online (Sandbox Code Playgroud)
其中第一个参数是XML文本,返回值为:
[LS "Greeting" "Hello", LS "Name" "Name"]
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
如果HaXml是最好的工具,我将如何使用HaXml来实现上述目标?
谢谢!
我从来没有真正想过要弄清楚如何使用HaXML从XML文档中提取比特; HXT满足了我的所有需求.
{-# LANGUAGE Arrows #-}
import Data.Maybe
import Text.XML.HXT.Arrow
type Name = String
type Value = String
data LocalizedString = LS Name Value
getLocalizedStrings :: String -> Maybe [LocalizedString]
getLocalizedStrings = (.) listToMaybe . runLA $ xread >>> getRoot
atTag :: ArrowXml a => String -> a XmlTree XmlTree
atTag tag = deep $ isElem >>> hasName tag
getRoot :: ArrowXml a => a XmlTree [LocalizedString]
getRoot = atTag "root" >>> listA getElem
getElem :: ArrowXml a => a XmlTree LocalizedString
getElem = atTag "elem" >>> proc x -> do
name <- getAttrValue "name" -< x
value <- getChildren >>> getText -< x
returnA -< LS name value
Run Code Online (Sandbox Code Playgroud)
你可能想要更多的错误检查(即不要atTag
像我一样懒惰地使用;实际上验证它<root>
是root,<elem>
是直接后代等等)但是这对你的例子来说效果很好.
现在,如果你需要对Arrow的介绍,不幸的是我不知道有什么好的.我自己也学会了"扔进大海学习如何游泳"的方式.
一些可能有助于记住的是,proc
/ -<
语法很简单糖的基本箭头操作(arr
,>>>
,等),就像do
/ <-
简直是糖的基本单子操作(return
,>>=
,等).以下是等效的:
getAttrValue "name" &&& (getChildren >>> getText) >>^ uncurry LS
proc x -> do
name <- getAttrValue "name" -< x
value <- getChildren >>> getText -< x
returnA -< LS name value
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1823 次 |
最近记录: |