現時点では、Relax NG スキーマを解析し、C++ オブジェクトのファイル内でルールを再現する必要があるアプリケーションの一部に取り組んでいます。よりよく説明できるように、サンプルコードから始めます。
<!-- property.element --> <define name="property.element"> <element name="property"> <attribute name="type" /> <interleave> <zeroOrMore> <ref name="resource.class" /> </zeroOrMore> <ref name="literal.class" /> </interleave> </element> </define>
次のような情報を保存できるオブジェクトを作成したい:
- [定義] 名前、
- 要素名、
- 属性名、
- 関連付けられたルール (0 個以上、1 個以上) を持つ許可された子要素。
次に、可能なすべての要素を GUI に表示して、(Relax NG スキーマに関して) 有効な要素のみをツリーのような構造に追加できるようにします。たとえば、resource.class またはliteral.class のみを property.element に追加できます。GUI で property.element ノードを選択すると、他のすべての可能な要素が GUI でグレー表示されます。私は Qt を使用しているので、スキーマを QDomDocument にロードして DOM ツリーにアクセスします。
このようなメカニズムは普遍的でなければなりません。つまり、要素の名前や構造に関係なく。私のドラフトでは、次のようないくつかのメンバーを配置する単純なクラスを作成しました: defined_name、element_name、required_attributes、optional_attributes。現在、C++ クラスでルールを表現する方法がわからないため、行き詰まっています。作業するオブジェクトの一定のセットがある場合、すべてのオブジェクトをハードコーディングしますが、オブジェクト セットは時間の経過とともに大幅に変化する可能性が非常に高くなります。誰にもアイデアはありますか?