【发布时间】:2016-01-22 14:07:31
【问题描述】:
可能你们中的任何人都知道一个可以通过以下方式将 XML 解析为 数据结构?
parseXML
[xmldef| <a>Int</a>[<b>String</b>] |]
"<a>1</a><b>Hello</b><b>World</b>"
== (1, ["Hello", "World"])
这里的关键是解析器需要一个足够描述性的定义 处理缺失的元素、元素列表,并将它们转化为本机数据结构。
我觉得这个定义的想法很有吸引力,并且认为它是 可能非常健壮。例如。呈现 XML 也是可逆的。
renderXML
[xmldef| <a>Int</a>[<b>String</b>] |]
(1, ["Hello", "World"])
== "<a>1</a><b>Hello</b><b>World</b>"
这是我想象的另一个例子:
data Coord = Coord Int Int
instance XMLDef Coord where
xmlDefinition = [xmldef| <x>Int</x><y>Int</y> |]
coordsDef = [xmldef| [<coord>Coord</coord>] |]
parseXML coordsDef "" == []
parseXML coordsDef longXML == [Coord 1 2, Coord 3 4]
longXML = "<coord><x>1</x><y>2</y></coord><coord><x>3</x><y>4</y></coord>"
renderXML coordsDef [Coord 5 6] == "<coord><x>5</x><y>6</y></coord>"
看起来相当简洁有力的符号。做这样的事情 Haskell 存在吗? 或者对于任何其他语言?
我知道this library (named 'syntax') 因此,如果没有其他选择,它也许可以用于构建上述 API 此时存在。
到目前为止
我用过the library named 'xml',它适用于简单的任务, 但它有两个缺点:它不支持一个共同的定义来解析 并渲染 XML,它比我概述的语法要冗长得多 以上是我的经验。
环顾四周,我发现haxml、hxt和hexpat也很流行 选择。然而,它们似乎也以同样的方式受到限制:不可逆 支持的定义,并且比我正在寻找的要详细得多 带着这个问题。
【问题讨论】:
标签: xml parsing haskell serialization