如何在C++对象中重现Relax NG规则

How do I reproduce Relax NG rules in C++ objects?

本文关键字:Relax NG 规则 C++ 对象      更新时间:2023-10-16

目前我正在处理应用程序的一部分,需要解析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>

我想创建一个可以存储信息的对象,比如:

  • [定义]名称
  • 元素名称
  • 属性名称
  • 允许的具有关联规则的子元素(零个或多个、一个或多个子元素)

然后,我想在GUI中显示所有可能的元素,在那里我只能将有效的(根据Relax NG模式)元素添加到树状结构中。例如,我只能将resource.class或literal.class添加到我的property.element中,当我在GUI中选择了property.eelement节点时,其他所有可能的元素在GUI中都会变灰。我使用Qt,所以我将模式加载到QDomDocument中以访问DOM树。

这样的机制必须是通用的,即无论元素如何命名或其结构如何。在我的草稿中,我创建了一个简单的类,在其中我放置了几个成员,如:defined_name、element_name、required_attributes、optional_attributes。目前我被卡住了,因为我不知道如何在C++类中表示规则。如果我有一组不变的对象,我会对每个对象进行硬编码,但随着时间的推移,我的对象集很可能会发生巨大的变化。有人知道吗?

使用TRANG将RNG文件转换为XSD,然后使用CodeSynthesis(XSD或XSDe)将XSD转换为c++。XSDe有很多示例,因此可能有一个示例演示如何使用模式规则验证xml输入。

http://www.thaiopensource.com/relaxng/trang.htmlhttp://www.codesynthesis.com/products/xsde/