如何使用Haskell访问某些XML数据(使用HaXml)?

前端之家收集整理的这篇文章主要介绍了如何使用Haskell访问某些XML数据(使用HaXml)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我希望能够访问 XML文件的数据
  1. <?xml version="1.0"?>
  2. <MY>
  3. <Foo id="1" name="test">
  4. <Argument name="a" />
  5. </Foo>
  6. <Foo id="2" name="test2">
  7. <Argument name="a" />
  8. <Argument name="b" />
  9. </Foo>
  10. <Other id="2" name="someOther"/>
  11. </MY>

我想要,例如用它的Arguments读出每个Foo,我怎么能用Haskell做到这一点? (我想使用HaXml模块)

我不知道从哪里开始.

我找不到haXml的最新文档和示例.

但是有一些HXT的文档可用.
我知道这可能对你的例子来说太过分了,但无论如何.

如果你想使用tagsoup,也许以下答案可能会有所帮助:
xml-tree parser (Haskell) for graph-library
In Haskell how do you extract strings from an XML document?

以下是HXT的文档示例:
http://www.haskell.org/haskellwiki/HXT/Conversion_of_Haskell_data_from/to_XML
http://www.haskell.org/haskellwiki/HXT
http://www.haskell.org/haskellwiki/HXT/Practical
http://en.wikibooks.org/wiki/Haskell/XML

现在代码使用HXT.
(警告我不确定这是否正确)

我按照教程:
http://www.haskell.org/haskellwiki/HXT/Conversion_of_Haskell_data_from/to_XML

你需要你的xml文件为“data.xml”

  1. import Data.Map (Map,fromList,toList)
  2. import Text.XML.HXT.Core
  3.  
  4.  
  5. type Foos = Map String [Foo]
  6.  
  7. data Foo = Foo
  8. {
  9. fooId :: String,fooName :: String,arguments :: [Argument]
  10. }
  11. deriving (Show,Eq)
  12.  
  13.  
  14.  
  15. data Argument = Argument
  16. { argName :: String
  17. }
  18. deriving (Show,Eq)
  19.  
  20. instance XmlPickler Foo where
  21. xpickle = xpFoo
  22.  
  23.  
  24. instance XmlPickler Argument where
  25. xpickle = xpArgument
  26.  
  27. -- WHY do we need this?? no clue
  28. instance XmlPickler Char where
  29. xpickle = xpPrim
  30.  
  31. -- this could be wrong
  32. xpFoos :: PU Foos
  33. xpFoos
  34. = xpWrap (fromList,toList
  35. ) $
  36. xpList $
  37. xpElem "MY" $
  38. xpickle
  39.  
  40. xpFoo :: PU Foo
  41. xpFoo
  42. = xpElem "Foo" $
  43. xpWrap ( uncurry3 Foo,\ f -> (fooId f,fooName f,arguments f
  44. )
  45. ) $
  46. xpTriple (xpAttr "id" xpText)
  47. (xpAttr "name" xpText)
  48. (xpList xpickle)
  49.  
  50.  
  51. xpArgument :: PU Argument
  52. xpArgument
  53. = xpElem "Argument" $
  54. xpWrap ( \ ((a)) -> Argument a,\ t -> (argName t)
  55. ) $
  56. (xpAttr "name" xpText )
  57.  
  58.  
  59. main :: IO ()
  60. main
  61. = do
  62. runX ( xunpickleDocument xpFoos
  63. [ withValidate no,withTrace 1,withRemoveWS yes,withPreserveComment no
  64. ] "data.xml"
  65. >>>
  66. arrIO ( \ x -> do {print x ; return x})
  67. )
  68. return ()

结果(您需要xml示例为“data.xml”):

  1. -- (1) getXmlContents
  2. -- (1) readDocument: "data.xml" (mime type: "text/xml" ) will be processed
  3. -- (1) readDocument: "data.xml" processed
  4. fromList [("",[Foo {fooId = "1",fooName = "test",arguments = [Argument {argName = "a"}]},Foo {fooId = "2",fooName = "test2",arguments = [Argument {argName = "a"},Argument {argName = "b"}]}])]

猜你在找的XML相关文章