2

xmlsimpleパッケージを使用して、カスタム 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 には、各種類の要素の下にネストできる要素を指定する規則があります。これらの規則に基づいて構造を制限する XML フラグメントを構築するために GADT を定義することは可能ですか? ルールは、許可される親子関係の種類を単純にリストしたものです (たとえば、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