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

从简单的XML获取数据

发布时间:2020-12-16 23:13:08 所属栏目:百科 来源:网络整理
导读:我试图使用HXT从6行的 XML输入中提取一些数据.我也希望保留HXT,因为Curl集成,因为我有其他XML文件有数千行,稍后. 我的XML看起来像这样: ?xml version = "1.0" encoding = "UTF-8"?find set_number228461/set_number no_records000000008/no_records no_entr
我试图使用HXT从6行的 XML输入中提取一些数据.我也希望保留HXT,因为Curl集成,因为我有其他XML文件有数千行,稍后.

我的XML看起来像这样:

<?xml version = "1.0" encoding = "UTF-8"?>
<find>
    <set_number>228461</set_number>
    <no_records>000000008</no_records>
    <no_entries>000000008</no_entries>
</find>

我一直试图聚在一起解析它.不幸的是,HXT的Wiki页面并没有太大的帮助(或者我只是忽略了一些东西).

data FindResult = FindResult {
        resultSetNumber :: String,resultNoRecords :: Int,resultNoEntries :: Int
    } deriving (Eq,Show)

resultParser :: ArrowXml a => a XmlTree FindResult
resultParser = hasName "find" >>> getChildren >>> proc x -> do
    setNumber <- isElem >>> hasName "set_number" >>> getChildren >>> getText -< x
    noRecords <- isElem >>> hasName "no_records" >>> getChildren >>> getText -< x
    noEntries <- isElem >>> hasName "no_entries" >>> getChildren >>> getText -< x
    returnA -< FindResult setNumber (read noRecords) (read noEntries)

find str = return . head =<< (runX $readDocument [withValidate no,withCurl []] query >>> resultParser)
    where query = "http://" ++ server ++ "/find?request=" ++ str

我一直得到的是

*** Exception: Prelude.head: empty list

所以,我想,解析必须严重错误,因为我检查并正确地从查询中获取XML.

解决方法

以下适合我(以 this example为模型):

{-# LANGUAGE Arrows #-}

module Main
       where

import Text.XML.HXT.Core
import System.Environment

data FindResult = FindResult {
        resultSetNumber :: String,Show)

resultParser :: ArrowXml a => a XmlTree FindResult
resultParser =
  deep (isElem >>> hasName "find") >>> proc x -> do
    setNumber <- getText <<< getChildren <<< deep (hasName "set_number") -< x
    noRecords <- getText <<< getChildren <<< deep (hasName "no_records") -< x
    noEntries <- getText <<< getChildren <<< deep (hasName "no_entries") -< x
    returnA -< FindResult setNumber (read noRecords) (read noEntries)

main :: IO ()
main = do [src] <- getArgs
          res <- runX $( readDocument [withValidate no] src >>> resultParser)
          print . head $res

测试:

$dist/build/test/test INPUT
FindResult {resultSetNumber = "228461",resultNoRecords = 8,resultNoEntries = 8}

(编辑:李大同)

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

    推荐文章
      热点阅读