xml - 在 haskell 数据结构中建模 XML 边缘情况
问题描述
我正在尝试从具有以下格式的 xml 文件中读取数据:
<items>
<item>
<dataType>number</dataType>
<name>two</name>
<data>2</data>
<group>even numbers</group>
</item>
<item>
<dataType>number</dataType>
<name>three</name>
<data>3</data>
<group>odd numbers</group>
<items>
<item>
<dataType>number</dataType>
<name>four</name>
<data>4</data>
<group>even numbers</group>
</item>
<item>
<dataType>number</dataType>
<name>five</name>
<data>5</data>
<group>odd numbers</group>
</item>
</items>
</item>
</items>
进入haskell数据结构,以便我可以操作数据结构中的数据。这是我的代码:
{-# LANGUAGE Arrows, NoMonomorphismRestriction #-}
import Text.XML.HXT.Core
import Data.Tree.NTree.TypeDefs
data Item = Item { datatype :: String
,name :: String
,data1 :: Integer
,group :: String
}
deriving (Show, Eq)
main :: IO ()
main = do
menu
menu :: IO ()
menu = do
items <- runX (readDocument [withValidate no] "data.xml"
>>> getitem)
print items
getitem :: ArrowXml cat => cat (NTree XNode) Item
getitem = deep (isElem >>> hasName "item" ) >>>
proc x -> do
datatype1 <- getText <<< getChildren <<< deep (hasName "dataType") -< x
name1 <- getText <<< getChildren <<< deep (hasName "name") -< x
dat <- getText <<< getChildren <<< deep (hasName "data") -< x
let dat1 = read dat :: Integer
group1 <- getText <<< getChildren <<< deep (hasName "group") -< x
returnA -< Item { datatype = datatype1, name = name1, data1 = dat1, group = group1 }
数据在到达包含数字 3 的第二个项目标签中的边缘情况后未正确读入结构。请帮助:(。
[Item {datatype = "number", name = "two", data1 = 2, group = "even numbers"},Item {datatype = "number", name = "three", data1 = 3, group = "odd numbers"},Item {datatype = "number", name = "three", data1 = 3, group = "even numbers"},Item {datatype = "number", name = "three", data1 = 3, group = "odd numbers"},Item {datatype = "number", name = "three", data1 = 4, group = "odd numbers"},Item {datatype = "number", name = "three", data1 = 4, group = "even numbers"},Item {datatype = "number", name = "three", data1 = 4, group = "odd numbers"},Item {datatype = "number", name = "three", data1 = 5, group =
"odd numbers"},Item {datatype = "number", name = "three", data1 = 5, group = "even numbers"},Item {datatype = "number", name = "three", data1 = 5, group = "odd numbers"},Item {datatype = "number", name = "four", data1 = 3, group = "odd numbers"},Item {datatype = "number", name = "four", data1 = 3, group = "even numbers"},Item {datatype = "number", name = "four", data1 = 3, group = "odd numbers"},Item {datatype = "number", name = "four", data1 = 4, group = "odd numbers"},Item {datatype = "number", name = "four", data1 = 4, group = "even numbers"},Item {datatype = "number", name = "four", data1 = 4, group = "odd numbers"},Item {datatype = "number", name = "four", data1 = 5, group = "odd numbers"},Item {datatype = "number", name = "four", data1 = 5, group = "even numbers"},Item {datatype = "number", name = "four", data1 = 5, group = "odd numbers"},Item {datatype = "number", name = "five", data1 = 3, group = "odd numbers"},Item {datatype = "number", name = "five", data1 = 3, group = "even numbers"},Item {datatype = "number", name = "five", data1 = 3, group = "odd numbers"},Item {datatype = "number", name = "five", data1 = 4, group = "odd numbers"},Item {datatype = "number", name = "five", data1 = 4, group = "even numbers"},Item {datatype = "number", name = "five", data1 = 4, group = "odd numbers"},Item {datatype = "number", name = "five", data1 = 5, group = "odd numbers"},Item {datatype = "number", name = "five", data1 = 5, group = "even numbers"},Item {datatype = "number", name = "five", data1 = 5, group = "odd numbers"},Item {datatype = "number", name = "three", data1 = 3, group = "odd numbers"},Item {datatype = "number", name = "three", data1 = 3, group = "even numbers"},Item {datatype = "number", name = "three", data1 = 3, group = "odd numbers"},Item {datatype = "number", name = "three", data1 = 4, group = "odd numbers"},Item {datatype = "number", name = "three", data1 = 4, group = "even numbers"},Item {datatype = "number", name = "three", data1 = 4, group = "odd numbers"},Item {datatype = "number", name = "three", data1 = 5, group = "odd numbers"},Item {datatype = "number", name = "three", data1 = 5, group = "even numbers"},Item {datatype = "number", name = "three", data1 = 5, group = "odd numbers"},Item {datatype = "number", name = "four", data1 = 3, group = "odd numbers"},Item {datatype = "number", name = "four", data1 = 3, group = "even numbers"},Item {datatype = "number", name = "four", data1 = 3, group = "odd numbers"},Item {datatype = "number", name = "four", data1 = 4, group = "odd numbers"},Item {datatype = "number", name = "four", data1 = 4, group = "even numbers"},Item {datatype = "number", name = "four", data1 = 4, group = "odd numbers"},Item {datatype = "number", name = "four", data1 = 5, group = "odd numbers"},Item {datatype = "number", name = "four", data1 = 5, group = "even numbers"},Item {datatype = "number", name = "four", data1 = 5, group = "odd numbers"},Item {datatype = "number", name = "five", data1 = 3, group = "odd numbers"},Item {datatype = "number", name = "five", data1 = 3, group = "even numbers"},Item {datatype = "number", name = "five", data1 = 3, group = "odd numbers"},Item {datatype = "number", name = "five", data1 = 4, group = "odd numbers"},Item {datatype = "number", name = "five", data1 = 4, group = "even numbers"},Item {datatype = "number", name = "five", data1 = 4, group = "odd numbers"},Item {datatype = "number", name
= "five", data1 = 5, group = "odd numbers"},Item {datatype = "number", name = "five", data1 = 5, group = "even numbers"},Item {datatype = "number", name = "five", data1 = 5, group = "odd numbers"},Item {datatype = "number", name = "three", data1 = 3, group = "odd numbers"},Item {datatype = "number", name = "three", data1 = 3, group = "even numbers"},Item {datatype = "number", name = "three", data1 = 3, group = "odd numbers"},Item {datatype = "number", name = "three", data1 = 4, group = "odd numbers"},Item {datatype = "number", name = "three", data1 = 4, group = "even numbers"},Item {datatype = "number", name = "three", data1 = 4, group = "odd numbers"},Item {datatype = "number", name = "three", data1 = 5, group = "odd numbers"},Item {datatype = "number", name = "three", data1 = 5, group = "even numbers"},Item {datatype = "number", name = "three", data1 = 5, group = "odd numbers"},Item {datatype = "number", name = "four", data1 = 3, group = "odd numbers"},Item {datatype = "number", name = "four", data1 = 3, group = "even numbers"},Item {datatype = "number", name = "four", data1 = 3, group = "odd numbers"},Item {datatype = "number", name = "four", data1 = 4, group = "odd numbers"},Item {datatype = "number", name = "four", data1 = 4, group = "even numbers"},Item {datatype = "number", name = "four", data1 = 4, group = "odd numbers"},Item {datatype = "number", name = "four", data1 = 5, group = "odd numbers"},Item {datatype = "number", name = "four", data1 = 5, group = "even numbers"},Item {datatype = "number", name = "four", data1 = 5, group = "odd numbers"},Item {datatype = "number", name = "five", data1 = 3, group = "odd numbers"},Item {datatype = "number", name = "five", data1 = 3, group = "even numbers"},Item {datatype = "number", name = "five", data1 = 3, group = "odd numbers"},Item {datatype = "number", name = "five", data1 = 4, group = "odd numbers"},Item {datatype = "number", name = "five", data1 = 4, group = "even numbers"},Item {datatype = "number", name = "five", data1
= 4, group = "odd numbers"},Item {datatype = "number", name = "five", data1 = 5, group = "odd numbers"},Item {datatype = "number", name = "five", data1 = 5, group = "even numbers"},Item {datatype = "number", name = "five", data1 = 5, group = "odd numbers"}]
那是我收到的输出。什么时候应该:
[Item {datatype = "number", name = "two", data1 = 2, group = "even numbers"},Item {datatype = "number", name = "three", data1 = 3, group = "odd numbers"},Item {datatype = "number", name = "four", data1 = 4, group = "even numbers"},Item {datatype = "number", name = "five", data1 = 5, group = "odd numbers"}]
解决方案
推荐阅读
- odoo - 如何在 Odoo 树视图中搜索过滤器/域限制记录?
- redis - 根据redis中值的引用删除键
- java - 如何在 JUnit5 中为测试套件设置自定义测试执行顺序?
- c# - 如何使用图形 api 到达 Sharepoint 文档中心
- android - 如何在 webview 中打开第 3 方 URL 上的选择文件意图?
- python - 有没有办法从另一个窗口更改一个窗口的标签?
- node.js - 在 Node.js 中管理会话的最佳方式是什么?
- python-3.x - Python 模块不兼容
- c++ - 链接静态库和动态库时的 ODR 冲突
- ffmpeg - ffmpeg 帧精确搜索,延迟最小