我正在尝试使用 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>
但是,我觉得这种方法有很多缺点:
- MyXMLElement 的数据定义(第 31 行)将需要与有效父子关系一样多的行。在不同的实现中,可以只列出一个元素的合法子元素,并在运行时检查合法关系。我选择了这种方法(使用 GADT),以便无效的 XML 树在编译时是非法的。
- eval 给出的接口非常有限:不允许任意嵌套(即使遵循父子关系规则);它不允许根据需要添加 XML 属性。
我想知道这个问题是否适合使用 GADT 的解决方案。如果是,如何设计得更好?