我正在尝试从定期为 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
库,但我所能开发的只是一个有效的代码,但对于这样一个简单的任务来说太大了,看起来像一个半生不熟的黑客,而不是最好的。
我不太了解解析器和 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
[]
有什么问题吗?