2

我正在尝试使用 simplexml包为自定义 XML 结构构建 XML 生成器。这是一个示例 XML 片段:

<Response>
  <Answer>Hello World</Answer>
  <Play loop="3">http://example.com/a.mp3</Play>
  <SendAnswer dest="someuri">
    <Answer>Something</Answer>
    <Play>someuri</Play>
  </SendAnswer>
</Response>

在这个自定义 XML 中,有一些规则指定可以在每种元素下嵌套哪些元素。是否可以定义一个 GADT 来构建基于这些规则限制结构的 XML 片段?规则简单地列出了允许的父子关系类型(例如,Response 不能是任何其他元素的子元素,SendAnswer 可以是 Response 的子元素等)。

这是我走了多远:https ://gist.github.com/4104499

执行时,它输出:

<Response>

  <Speak loop="2">

    http://example.com/a.mp3
  </Speak>
</Response>

但是,我觉得这种方法有很多缺点:

  1. MyXMLElement 的数据定义(第 31 行)将需要与有效父子关系一样多的行。在不同的实现中,可以只列出一个元素的合法子元素,并在运行时检查合法关系。我选择了这种方法(使用 GADT),以便无效的 XML 树在编译时是非法的。
  2. eval 给出的接口非常有限:不允许任意嵌套(即使遵循父子关系规则);它不允许根据需要添加 XML 属性。

我想知道这个问题是否适合使用 GADT 的解决方案。如果是,如何设计得更好?

4

0 回答 0