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

dev*_*vel 7 xml haskell haxml

我希望能够访问XML文件的数据

<?xml version="1.0"?>
<MY>
  <Foo id="1" name="test">
    <Argument name="a" />
  </Foo>
  <Foo id="2" name="test2">
    <Argument name="a" />
    <Argument name="b" />
  </Foo>
  <Other id="2" name="someOther"/>
</MY>
Run Code Online (Sandbox Code Playgroud)

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

我不知道从哪里开始.

aug*_*tss 5

对于简单的任务,您可能需要考虑使用tagsoup包.

  • 你能解释一下如何使用tagsoup吗? (2认同)

Dfr*_*Dfr 5

是的,文档是关于haskell的重要缺点.我想知道为什么haskell人讨厌如此记录他们的代码.不需要胖纸,很少使用例子通常绰绰有余.

此处还提供了HaXML使用的小例子:http://book.realworldhaskell.org/read/extended-example-web-client-programming.html


mrs*_*eve 3

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

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

如果您想使用 tagoup,也许以下答案可能会有所帮助:
xml-tree parser (Haskell) for graph-library
在 Haskell 中,如何从 XML 文档中提取字符串?

以下是 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/实用
http://en.wikibooks.org/wiki/Haskell/XML

现在代码使用HXT。(警告我不确定这是否是正确的方法)

我遵循了教程: http://www.haskell.org/haskellwiki/HXT/Conversion_of_Haskell_data_from/to_XML

您需要 xml 文件作为“data.xml”

import Data.Map (Map, fromList, toList)
import Text.XML.HXT.Core


type Foos = Map String [Foo]

data Foo = Foo
     { 
       fooId :: String 
     , fooName :: String
     , arguments :: [Argument]  
     } 
          deriving (Show, Eq)



data Argument = Argument
      { argName  :: String
      }
           deriving (Show, Eq)

instance XmlPickler Foo where
  xpickle = xpFoo


instance XmlPickler Argument where
  xpickle = xpArgument

-- WHY do we need this?? no clue            
instance XmlPickler Char where
    xpickle = xpPrim

-- this could be wrong
xpFoos :: PU Foos
xpFoos
  = xpWrap (fromList
          , toList
          ) $
  xpList $
      xpElem "MY" $ 
      xpickle

xpFoo :: PU Foo
xpFoo
  = xpElem "Foo" $
     xpWrap ( uncurry3 Foo
            , \ f -> (fooId f
                      , fooName f
                      , arguments f
                     )  
           ) $          
    xpTriple (xpAttr "id" xpText) 
              (xpAttr "name" xpText)
              (xpList xpickle)


xpArgument :: PU Argument
xpArgument
    = xpElem "Argument" $
       xpWrap ( \ ((a)) -> Argument a
               , \ t -> (argName t)
              ) $
       (xpAttr "name" xpText )


main    :: IO ()
main
     = do
       runX ( xunpickleDocument xpFoos
                                [ withValidate no
                                , withTrace 1
                                , withRemoveWS yes
                                , withPreserveComment no
                                ] "data.xml"
         >>>
             arrIO ( \ x -> do {print x ; return x}) 
            )
       return ()
Run Code Online (Sandbox Code Playgroud)

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

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