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

前端之家收集整理的这篇文章主要介绍了在Haskell中,如何从XML文档中提取字符串?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我有这样的 XML文档: @H_502_1@<root> <elem name="Greeting"> Hello </elem> <elem name="Name"> Name </elem> </root>

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

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

我想写一个带有以下签名的Haskell函数

@H_502_1@getLocalizedStrings :: String -> [LocalizedString]

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

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

我该怎么做?

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

谢谢!

我从来没有真正打算弄清楚如何使用 HaXML从XML文档中提取比特; HXT满足了我的所有需求. @H_502_1@{-# 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,>> =等) .以下是等效的:

@H_502_1@getAttrValue "name" &&& (getChildren >>> getText) >>^ uncurry LS proc x -> do name <- getAttrValue "name" -< x value <- getChildren >>> getText -< x returnA -< LS name value
原文链接:https://www.f2er.com/xml/292484.html

猜你在找的XML相关文章