xmlgen:在Haskell中生成混合内容XML节点(即同时包含正文和嵌套XML元素)

xmlgen:在Haskell中生成混合内容XML节点(即同时包含正文和嵌套XML元素),haskell,xml-generation,Haskell,Xml Generation,我正在尝试使用混合内容节点(包含正文和子节点)生成XML,如下所示: <person> some text <hugo age="24">thingy</hugo> </person> 一些文本 东西 我正在使用图书馆 以下是我取得的成绩: import Text.XML.Generator import qualified Data.ByteString as B makeElt = xelem "person" $

我正在尝试使用混合内容节点(包含正文和子节点)生成XML,如下所示:

<person>
some text
<hugo age="24">thingy</hugo>
</person>

一些文本
东西
我正在使用图书馆

以下是我取得的成绩:

import Text.XML.Generator
import qualified Data.ByteString as B

makeElt = xelem "person" $
            xelems $ (xtext "some text" : 
                      (xelem "hugo" (xattr "age" "24" <#> 
                                     xtext "thingy")))

main = do
  let elt = makeElt
  B.putStr . xrender $ doc defaultDocInfo elt
import Text.XML.Generator
将限定数据.ByteString作为B导入
makeElt=xelem“人”$
xelems$(xtext“一些文本”:
(希勒姆“雨果”(xattr“24岁”)
xtext“thingy”))
main=do
让elt=makeElt
B.putStr。xrender$doc defaultDocInfo elt
这无法编译,GHC的错误消息对我来说是不可理解的(作为初学者):

$runhaskell test.hs
测试。hs:6:24:
无法将类型“Elem”与“Xml Elem”匹配
函数“xelem”应用于两个参数,
但是它的类型是“[Char]
->Text.XML.Generator.MkElemRes[Char](XML属性,XML元素)'
只有一个
在“(:)”的第二个参数中,即
`(希莱姆“雨果”(xattr“age”“24”xtext“thingy”)'
在“($)”的第二个参数中,即
`(xtext“一些文本”
:(xelem“hugo”(xattr“age”“24”xtext“thingy”))
测试。hs:6:24:
无法将类型“Xml”与“[]”匹配
函数“xelem”应用于两个参数,
但是它的类型是“[Char]
->Text.XML.Generator.MkElemRes[Char](XML属性,XML元素)'
只有一个
在“(:)”的第二个参数中,即
`(希莱姆“雨果”(xattr“age”“24”xtext“thingy”)'
在“($)”的第二个参数中,即
`(xtext“一些文本”
:(xelem“hugo”(xattr“age”“24”xtext“thingy”))
我是否非常接近我所需要的结果,或者我应该以不同的方式来写这篇文章


我试图寻找xmlgen库的使用示例,但没有找到我的用例。非常感谢您的帮助。

问题出在表达式中

(xtext "some text" : 
 (xelem "hugo" (xattr "age" "24" <#> 
                xtext "thingy")))
一个好问题是,为什么GHC首先会给出如此糟糕的错误消息。问题是
xelem
的结果类型重载,事实上
xelem
具有类型
n->MkElemRes n c
。您试图在示例中使用的
MkElemRes n c
的实例化确实是一种函数类型,因此示例的这一部分是正确的。但一般来说,
MkElemRes n c
不需要是函数类型,这就是为什么GHC抱怨两个参数,而它只需要一个参数(即类型
MkElemRes n c

以下是解决原始问题的一个解决方案:

xelem "person" $ 
   xelems [xtext "some text", xelem "hugo" (xattr "age" "24" <#> xtext "thingy")]
xelem“个人”$
xelems[xtext“some text”,xelem“hugo”(xattr“age”“24”xtext“thingy”)]
以下是另一种解决方案:

xelem "person" $ xtext "some text" <> xelem "hugo" (xattr "age" "24" <#> xtext "thingy")
xelem“person”$xtext“一些文本”xelem“hugo”(xattr“age”“24”xtext“thingy”)

问题出在表达式中

(xtext "some text" : 
 (xelem "hugo" (xattr "age" "24" <#> 
                xtext "thingy")))
一个好问题是,为什么GHC首先会给出如此糟糕的错误消息。问题是
xelem
的结果类型重载,事实上
xelem
具有类型
n->MkElemRes n c
。您试图在示例中使用的
MkElemRes n c
的实例化确实是一种函数类型,因此示例的这一部分是正确的。但一般来说,
MkElemRes n c
不需要是函数类型,这就是为什么GHC抱怨两个参数,而它只需要一个参数(即类型
MkElemRes n c

以下是解决原始问题的一个解决方案:

xelem "person" $ 
   xelems [xtext "some text", xelem "hugo" (xattr "age" "24" <#> xtext "thingy")]
xelem“个人”$
xelems[xtext“some text”,xelem“hugo”(xattr“age”“24”xtext“thingy”)]
以下是另一种解决方案:

xelem "person" $ xtext "some text" <> xelem "hugo" (xattr "age" "24" <#> xtext "thingy")
xelem“person”$xtext“一些文本”xelem“hugo”(xattr“age”“24”xtext“thingy”)