2009-12-19 76 views
1

將XML模式映射到C/C++的最佳方式是什麼?如何將XML模式映射到C/C++代碼?

下面是一個例子:

------ C/C++ -----

struct zone { 
     char *var_name; 
     float var_value; 
    }; 

------ ----- XML

<xs:element name="zone"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element name="Var_name" type="xs:string"/> 
      <xs:element name="var_value" type="xs:decimal"/> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
+0

如果你想C兼容,如果你使用C++或者一對'char *'和'int',我會建議將xs:string映射到更好的結構,'std :: string'。 – 2009-12-19 13:41:43

+0

您的意思是:如何將C++抽象語法樹映射到XML結構? – xtofl 2010-11-06 09:04:58

回答

2

Xerces作爲拉入XML文檔的庫非常有效。 (你沒有說什麼操作系統或開發環境,所以這是非常通用的C和C++。)

從那裏一個結構/類每個元素將是一個很好的映射。如果你有很多XML元素需要解析,我會試着尋找或者編寫一個代碼生成器來引入XML並吐出你的類或結構定義。一旦你做對了,爲任何XML元素做這件事都是一件小事。

+0

感謝您的回覆。其實我正在使用gcc和Windows XP與vC++ 6的solaris。因爲我有兩個程序(一個使用xml和其他C++),我正試圖將它們耦合起來運行一些模擬研究。再次感謝您的幫助, – make 2009-12-19 05:10:40

0

使用XSLT可以很好地實現從XML這樣的代碼生成。如果您安裝了libxslt,則可以使用xsltproc執行轉換。在構建過程中將其作爲預構建步驟以生成源代碼。

如何:

structs.xml

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xs:element name="zone"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="Var_name" type="xs:string"/> 
     <xs:element name="var_value" type="xs:decimal"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<xs:element name="zone2"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="Var_name" type="xs:string"/> 
     <xs:element name="var_value" type="xs:decimal"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

</xs:schema> 

makestructs.xsl

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0"> 
    <xsl:output method="text" /> 
    <xsl:template match="/"> 
     <xsl:for-each select="/xs:schema/xs:element"> 
struct <xsl:value-of select="@name" /> { 
      <xsl:for-each select="xs:complexType/xs:sequence/xs:element"> 
       <xsl:choose> 
        <xsl:when test="@type = 'xs:string'"> 
    char* 
        </xsl:when> 
        <xsl:when test="@type = 'xs:decimal'"> 
    float 
        </xsl:when> 
       </xsl:choose> 
      <xsl:value-of select="@name" />; 
      </xsl:for-each> 
}; 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

樣式表是縮進以提高可讀性。但你會想要刪除一些空白,所以它不會出現在輸出中。

+0

感謝您的回覆?然後ho來映射C/C++代碼?你可以再次舉一個例子/再次感謝 – make 2009-12-29 21:40:20

+0

你的意思是你有C結構定義,你想映射到XML模式?這個問題提出了相反的問題,所以也許你應該澄清。 – 2009-12-29 23:23:55

6

CodeSynthesis XSD是一個XML模式到C++編譯器,幾乎完全符合您的要求。如果您想要更輕量級的版本,還有XSD/e更適合移動/嵌入式開發。

+0

非常感謝!那太棒了,我會嘗試一下......再次感謝 – make 2009-12-21 15:59:00