2013-07-23 19 views
1

在momemet我正在處理我的應用程序的一部分,我需要解析放鬆NG模式並在C++對象中重現文件內的規則。我從示例代碼開始,所以我可以更好地解釋。如何在C++對象中重現Relax NG規則?

<!-- 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.element節點時,其他所有可能的元素都會在我的GUI中顯示爲灰色。我使用Qt,因此我將模式加載到QDomDocument中以訪問DOM樹。

這樣的機制必須是通用的,即不管元素如何命名,或者其結構如何。在我的草稿中,我創建了簡單的類,其中放置了多個成員,如:defined_name,element_name,required_attributes,optional_attributes。目前我被卡住了,因爲我不知道如何在C++類中表示規則。如果我的工作對象是固定的,我會對每個對象進行硬編碼,但是隨着時間的推移,我的對象集很可能會發生劇烈變化。有人有什麼主意嗎?

+0

一個_rule_基類和N-派生類(_zeroOrMore_等,一個用於每個已知規則)。另外一個通用的_rule_類(帶有映射到節點名稱的_rule_name_成員)。 –

回答

0

使用TRANG將RNG文件轉換爲XSD,然後使用CodeSynthesis(XSD或XSDe)將XSD轉換爲C++)。 XSDe有很多示例,所以可能會有一個演示如何使用模式規則驗證xml輸入。

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

+0

郵件列表發佈http://www.codesynthesis.com/pipermail/xsd-users/2010-November/003080.html,主題爲「自動生成圖形用戶界面(QT中的GUI)」,可能會對需要Qt GUI。 –