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

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

发布时间:2020-12-16 07:47:15 所属栏目:百科 来源:网络整理
导读:如果我有这样的 XML文档: root elem name="Greeting" Hello /elem elem name="Name" Name /elem/root 和一些像这样的Haskell类型/数据定义: type Name = String type Value = String data LocalizedString = LS Name Value 我想写一个带有以下签名的Haskel
如果我有这样的 XML文档:
<root>
  <elem name="Greeting">
    Hello
  </elem>
  <elem name="Name">
    Name
  </elem>
</root>

和一些像这样的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来实现上述目标?

谢谢!

我从来没有真正打算弄清楚如何使用 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>是root,< elem>是直接后代等等)但是这样可以正常工作你的榜样.

现在,如果你需要介绍Arrows,遗憾的是我不知道有什么好的.我自己也学会了“扔进大海学习如何游泳”的方式.

可能有助于记住的一点是proc / – <语法只是基本箭头操作的糖(arr,>>>等),就像do /< - 只是基本monad操作的糖(return,>> =等) .以下是等效的:

getAttrValue "name" &&& (getChildren >>> getText) >>^ uncurry LS

proc x -> do
    name <- getAttrValue "name" -< x
    value <- getChildren >>> getText -< x
    returnA -< LS name value

(编辑:李大同)

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

    推荐文章
      热点阅读