将XML解析为数据结构,具有可逆的通用定义?

时间:2016-01-22 14:07:31

标签: xml parsing haskell serialization

你们中的任何人都可能知道一个可以通过以下方式解析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也很受欢迎 选择。然而,它们似乎也以同样的方式受到限制:没有可逆性 支持的定义,比我正在寻找的更冗长 有了这个问题。

1 个答案:

答案 0 :(得分:0)

已经有bidirectional JSON parser in Haskell的实现,因此可以使用类似的方法实现可逆的XML解析器。还有一种名为BIGUL的特定于域的语言可用于在Haskell中实现可逆解析器。