Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在xml管道中,什么是;“适当的”;将光标传递给函数的方法?_Xml_Haskell - Fatal编程技术网

在xml管道中,什么是;“适当的”;将光标传递给函数的方法?

在xml管道中,什么是;“适当的”;将光标传递给函数的方法?,xml,haskell,Xml,Haskell,通过一次提问,我学会了如何使用xml管道对GPX文件进行一些基本的xml解析 经过一些烦躁之后,我现在有了一个处理GPX文件的函数,如下所示: {-# LANGUAGE OverloadedStrings #-} import Control.Applicative import Data.Text as T import Text.XML import Text.XML.Cursor data Trkpt = Trkpt { trkptTime :: Text,

通过一次提问,我学会了如何使用
xml管道
对GPX文件进行一些基本的xml解析

经过一些烦躁之后,我现在有了一个处理GPX文件的函数,如下所示:

{-# LANGUAGE OverloadedStrings #-}

import Control.Applicative
import Data.Text           as T
import Text.XML
import Text.XML.Cursor

data Trkpt = Trkpt {
  trkptTime :: Text,
  trkptLat  :: Text,
  trkptLon  :: Text
  } deriving (Show)

trkptsFromFile path =
  trkpts . fromDocument <$> Text.XML.readFile def path

trkpts cur =
  (cur $/ elm "trk" &/ elm "trkseg" &/ elm "trkpt") >>= extract
  where
    elm n = element $ Name n (Just "http://www.topografix.com/GPX/1/1") Nothing
    extract cur = do
      let time = T.concat $ cur $/ elm "time" &// content
      let lat  = T.concat $ attribute "lat" cur
      let lon  = T.concat $ attribute "lon" cur
      return $ Trkpt time lat lon

我注意到我必须将第一部分用括号括起来,以便
>=
将其放入我的
提取
函数中。这是正确的方法还是有一些惯用的方法使用
xml管道
包中提供的运算符?

您可以使用
=>
而不是
>=
来避免括号:

(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)

-- Specializing for m ~ [] and a ~ Cursor Node and b ~ Cursor Node
(>=>) :: Axis Node -> (Cursor Node -> [c]) -> Cursor Node -> [c]

cur $/ elm "trk" &/ elm "trkseg" &/ elm "trkpt" >=> extract
因此,
(>=>)
的工作原理类似于
(&/)
,但不首先检索当前节点的子节点


免责声明:我还没有真正尝试过这个

谢谢,它成功了。这个光标/轴术语仍然让我困惑。必须处理它。@Ana一个
光标
只指向一个节点(并允许有效导航,如获取子节点/父节点/同级节点)。“轴”只是将
光标
赋予
节点
,返回
光标
的列表(因此
光标->[Cursor]
)。因此,“Axis”只是一种查询:给定一个节点,它返回一个匹配查询的节点列表。
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)

-- Specializing for m ~ [] and a ~ Cursor Node and b ~ Cursor Node
(>=>) :: Axis Node -> (Cursor Node -> [c]) -> Cursor Node -> [c]

cur $/ elm "trk" &/ elm "trkseg" &/ elm "trkpt" >=> extract