当前位置:  开发笔记 > Android > 正文

在Haskell中,如何从XML文档中提取字符串?

如何解决《在Haskell中,如何从XML文档中提取字符串?》经验,为你挑选了1个好方法。

如果我有这样的XML文档:


  
    Hello
  
  
    Name
  

和一些像这样的Haskell类型/数据定义:

 type Name = String
 type Value = String
 data LocalizedString = LS Name Value

我想用以下签名编写Haskell函数:

 getLocalizedStrings :: String -> [LocalizedString]

其中第一个参数是XML文本,返回值为:

 [LS "Greeting" "Hello", LS "Name" "Name"]

我该怎么做?

如果HaXml是最好的工具,我将如何使用HaXml来实现上述目标?

谢谢!



1> ephemient..:

我从来没有真正想过要弄清楚如何使用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

你可能想要更多的错误检查(即不要atTag像我一样懒惰地使用;实际上验证它是root,是直接后代等等)但是这对你的例子来说效果很好.


现在,如果你需要对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

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有