2011-07-19 70 views
0

我正在尝试循环遍历一个树结构并使用(语言)C将其序列化为一个字符串。我是一个真正的新手,当涉及到C(来自Java,C# ,动作脚本背景),我无法掌握一般的东西。C树XML序列化

我应该使用库来帮助生成XML吗?如何使用C实现递归?

感谢

回答

5

我应该使用一个库,以帮助生成XML?

是的。 libxmlminixml等。只是谷歌认识别人,但我会用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叉树。如果你的树是二进制的,代码将几乎相同。