gpt4 book ai didi

xml - 如何使用 Haskell 的 xml 管道解析 GPX 文件?

转载 作者:数据小太阳 更新时间:2023-10-29 02:26:08 25 4
gpt4 key购买 nike

我想使用 xml-conduit 来解析 GPX 文件。到目前为止,我有以下内容:

{-# LANGUAGE OverloadedStrings #-}

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

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

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

gpxTrkpts =
child >=> element "{http://www.topografix.com/GPX/1/0}trk" >=>
child >=> element "{http://www.topografix.com/GPX/1/0}trkseg" >=>
child >=> element "{http://www.topografix.com/GPX/1/0}trkpt" >=>
child >=> \e -> do
let ele = T.concat $ element "{http://www.topografix.com/GPX/1/0}ele" e >>= descendant >>= content
let time = T.concat $ element "{http://www.topografix.com/GPX/1/0}time" e >>= descendant >>= content
let lat = T.concat $ attribute "lat" e
let lon = T.concat $ attribute "lon" e
return $ Trkpt lat lon ele time

示例 GPX 文件是 here .

我得到了奇怪的结果,其中解析的文本大部分是空的,有一些零星的实际值,尽管原始 GPX 文件数据都是有效的。当有一个实际值时,它只在记录的一个字段中。

我很确定我没有正确使用 xml-conduit API。我做错了什么?

最佳答案

两个问题。首先,命名空间有错字;它应该是 http://www.topografix.com/GPX/1/1。其次,您最终的 Kleisli 箭头(\e -> do -- etc.)作用于 trkpt 元素的子元素,而不是作用于 trkpt 他们自己。这是一个 gpxTrkpts 应该做你想做的事:

gpxTrkpts =
child >=> element "{http://www.topografix.com/GPX/1/1}trk" >=>
child >=> element "{http://www.topografix.com/GPX/1/1}trkseg" >=>
child >=> element "{http://www.topografix.com/GPX/1/1}trkpt" >=>
\e -> do
let cs = child e
ele = T.concat $ cs >>= element "{http://www.topografix.com/GPX/1/1}ele" >>= descendant >>= content
time = T.concat $ cs >>= element "{http://www.topografix.com/GPX/1/1}time" >>= descendant >>= content
lat = T.concat $ attribute "lat" e
lon = T.concat $ attribute "lon" e
return $ Trkpt lat lon ele time

关于xml - 如何使用 Haskell 的 xml 管道解析 GPX 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31897737/

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