首页 > 解决方案 > 在 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"}]

标签: xmlhaskellstructuremodeling

解决方案


推荐阅读