gpt4 book ai didi

xml - 在 Haskell 中解析 XML

转载 作者:数据小太阳 更新时间:2023-10-29 01:40:07 27 4
gpt4 key购买 nike

我正在尝试从定期提供带有股票市场报价 ( sample data) 的 XML 文件的网页中获取数据。 XML 的结构非常简单,大概是这样的:

<?xml version="1.0"?>
<Contents>
<StockQuote Symbol="PETR3" Date="21-12-2010" Time="13:20" Price="23.02" />
</Contents>

(不止于此,但这足以作为示例)。

我想把它解析成一个数据结构:

 data Quote = Quote { symbol :: String, 
date :: Data.Time.Calendar.Day,
time :: Data.Time.LocalTime.TimeOfDay,
price :: Float}

我或多或少地了解 Parsec 是如何工作的(在 Real World Haskell 书的水平上),并且我尝试了一点 Text.XML 库,但我所能开发的只是一个有效的代码但是对于这样一个简单的任务来说太大了,看起来像一个半生不熟的 hack 而不是最好的。

我对解析器和 XML 了解不多(我基本上知道我在 RWH 书中看到的内容,我以前从未使用过解析器)(我只是做统计和数值编程,我不是计算机科学家)。是否有一个 XML 解析库,我可以在其中告诉模型是什么并立即提取信息,而不必手动解析每个元素,也不必解析纯字符串?

我在想类似的事情:

  myParser = do cont  <- openXMLElem "Contents"
quote <- openXMLElem "StockQuote"
symb <- getXMLElemField "Symbol"
date <- getXMLElemField "Date"
(...)
closequote <- closeXMLElem "StockQuote"
closecont <- closeXMLElem "Contents"
return (symb, date)


results = parse myParser "" myXMLString

我不必处理纯字符串并自己创建组合器(我很讨厌)。

编辑:我可能需要阅读一些关于一般解析器(不仅仅是 Parsec)的内容(足以以正确的方式完成这项工作)和关于 XML 的最少内容。你们有什么推荐的吗?

我要解析的真正字符串是这样的:

 stringTest = "<?xml version=\"1.0\"?>\r\n<ComportamentoPapeis><Papel Codigo=\"PETR3\" 
Nome=\"PETROBRAS ON\" Ibovespa=\"#\" Data=\"05/01/201100:00:00\"
Abertura=\"29,80\" Minimo=\"30,31\" Maximo=\"30,67\" Medio=\"30,36\"
Ultimo=\"30,45\" Oscilacao=\"1,89\" Minino=\"29,71\"/></ComportamentoPapeis>\r\n"

编辑2:

我尝试了以下方法(readFloat、readQuoteTime 等...只是从字符串中读取内容的函数)。

bvspaParser :: (ArrowXml a) => a XmlTree Quote
bvspaParser = hasName "ComportamentoPapeis" /> hasName "Papel" >>> proc x -> do
(hour,date) <- readQuoteTime ^<< getAttrValue "Data" -< x
quoteCode <- getAttrValue "Codigo" -< x
openPrice <- readFloat ^<< getAttrValue "Abertura" -< x
minim <- readFloat ^<< getAttrValue "Minimo" -< x
maxim <- readFloat ^<< getAttrValue "Maximo" -< x
ultimo <- readFloat ^<< getAttrValue "Ultimo" -< x
returnA -< Quote quoteCode (LocalTime date hour) openPrice minim maxim ultimo

docParser :: String -> IO [Quote]
docParser str = runX $ readString [] str >>> (parseXmlDocument False) >>> bvspaParser

当我在 ghci 中调用它时:

*Main> docParser stringTest >>= print
[]

有什么问题吗?

最佳答案

有很多为 Haskell 编写的 XML 库可以为您进行解析。我推荐名为 xml 的库(请参阅 http://hackage.haskell.org/package/xml)。有了它,您可以简单地编写例如:

let contents = parseXML source
quotes = concatMap (findElements $ simpleName "StockQuote") (onlyElems contents)
symbols = map (findAttr $ simpleName "Symbol") quotes
simpleName s = QName s Nothing Nothing
print symbols

此代码段打印 [Just "PETR3"] 作为示例 XML 的结果,并且很容易扩展以收集您需要的所有数据。要以您描述的样式编写程序,您应该使用 Maybe monad,因为 xml 查找函数通常返回 Maybe String,表示是否可以找到标记、元素或属性。另请参阅相关问题:Which Haskell XML library to use?

关于xml - 在 Haskell 中解析 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4619206/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com