2011-07-19 14 views
0

私は現在、ツリー構造をループして、(言語)Cを使用して文字列にシリアル化しようとしています。私はC言語(Java、C# 、アクションスクリプトの背景)と私は一般的なことを把握することに問題があります。CツリーのXMLシリアル化

XMLを生成するためにライブラリを使用する必要がありますか?どのように私はCを使用して再帰を実装するのですか?

おかげ

答えて

5

私はXMLを生成支援するライブラリを使用する必要がありますか?

はい。 libxml,minixmlなど。ちょうど他の人を知ってgoogle、しかし私はlibxmlに行くだろう。

Cを使用して再帰を実装するにはどうすればよいですか?

まあ、再帰自体を実装するのは本当に簡単です。たとえば、これは再帰的です。

int fact(int i) 
{ 
    return i ? i*fact(i-1) : 1; 
} 

問題は複雑になりたいと思います。しかしXMLでは、ライブラリを使用します。

+0

+1「あなたはXMLのためにライブラリを使用しています。 –

1

のlibxmlを使用して、それはこのように行くことができる:

#include <libxml/tree.h> 

typedef struct _node 
{ 
    int value; 
    int childrenCount; 
    struct _node *children; 
} node; 

char buff[256]; 

node* createTree() 
{ 
    // some code to create the tree 
} 

// build XML for the tree recursively 
void buildXml(xmlNodePtr xmlNodeParent, node *treeNode) 
{ 
    int i; 
    xmlNodePtr xmlNode = xmlNewChild(xmlNodeParent, NULL, BAD_CAST "node", NULL); 
    sprintf(buff, "%i", treeNode->value); 
    xmlNewProp(xmlNode, BAD_CAST "value", BAD_CAST buff); 
    for (i = 0; i < treeNode->childrenCount; i++) 
    { 
     buildXml(xmlNode, &treeNode->children[i]); 
    } 
} 

xmlDocPtr createDoc(node* treeRoot) 
{ 
    xmlDocPtr doc = NULL; 
    xmlNodePtr rootNode = NULL; 

    doc = xmlNewDoc(BAD_CAST "1.0"); 
    rootNode = xmlNewNode(NULL, BAD_CAST "tree"); 
    xmlDocSetRootElement(doc, rootNode); 

    buildXml(rootNode, treeRoot); 

    return doc; 
} 

int main() 
{ 
    node *root; 
    xmlDocPtr xmlDoc; 
    root = createTree(); 
    xmlDoc = createDoc(root); 
    // print the result to console 
    xmlSaveFormatFileEnc("-", xmlDoc, "UTF-8", 1); 
} 

このコードは、一般のn分木を使用しています。ツリーがバイナリの場合、コードはほぼ同じになります。