Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C树XML序列化_C_Xml_Serialization_Recursion - Fatal编程技术网

C树XML序列化

C树XML序列化,c,xml,serialization,recursion,C,Xml,Serialization,Recursion,我目前正在尝试递归地循环一个树结构,并使用(语言)C将其序列化为字符串。对于C(来自Java、C#、动作脚本背景),我是一个真正的新手,而且我很难掌握一般情况 我应该使用库来帮助生成XML吗?如何使用C实现递归 谢谢 我应该使用库来帮助生成XML吗 对,等等。只是通过谷歌了解其他人,但我会选择libxml 如何使用C实现递归 实现递归本身非常简单。例如,这是递归的: int fact(int i) { return i ? i*fact(i-1) : 1; } 问题在于你想变得多复杂。

我目前正在尝试递归地循环一个树结构,并使用(语言)C将其序列化为字符串。对于C(来自Java、C#、动作脚本背景),我是一个真正的新手,而且我很难掌握一般情况

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

谢谢

我应该使用库来帮助生成XML吗

对,等等。只是通过谷歌了解其他人,但我会选择libxml

如何使用C实现递归

实现递归本身非常简单。例如,这是递归的:

int fact(int i)
{
    return i ? i*fact(i-1) : 1;
}
问题在于你想变得多复杂。但是对于XML,使用库

我应该使用库来帮助生成XML吗

对,等等。只是通过谷歌了解其他人,但我会选择libxml

如何使用C实现递归

实现递归本身非常简单。例如,这是递归的:

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

问题在于你想变得多复杂。但是对于XML,请使用库。

使用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);
}
#包括
类型定义结构节点
{
int值;
国际儿童计数;
结构节点*子节点;
}节点;
字符buff[256];
节点*createTree()
{
//创建树的一些代码
}
//递归地为树构建XML
void buildXml(xmlNodePtr xmlNodeParent,node*treeNode)
{
int i;
xmlNodePtr xmlNode=xmlNewChild(xmlNodeParent,NULL,错误的“节点”,NULL);
sprintf(buff,“%i”,树节点->值);
xmlNewProp(xmlNode,BAD_CAST“value”,BAD_CAST buff);
对于(i=0;ichildrenCount;i++)
{
buildXml(xmlNode和treeNode->children[i]);
}
}
xmlDocPtr createDoc(节点*treeRoot)
{
xmlDocPtr doc=NULL;
xmlNodePtr rootNode=NULL;
doc=xmlNewDoc(BAD_CAST“1.0”);
rootNode=xmlNewNode(NULL,错误的“树”);
xmlDocSetRootElement(doc,rootNode);
buildXml(rootNode,treeRoot);
退货单;
}
int main()
{
节点*根;
xmlDocPtr xmlDoc;
root=createTree();
xmlDoc=createDoc(根);
//将结果打印到控制台
xmlSaveFormatFileEnc(“-”,xmlDoc,“UTF-8”,1);
}

此代码使用一般的n元树。如果您的树是二进制的,那么代码几乎是相同的。

使用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);
}
#包括
类型定义结构节点
{
int值;
国际儿童计数;
结构节点*子节点;
}节点;
字符buff[256];
节点*createTree()
{
//创建树的一些代码
}
//递归地为树构建XML
void buildXml(xmlNodePtr xmlNodeParent,node*treeNode)
{
int i;
xmlNodePtr xmlNode=xmlNewChild(xmlNodeParent,NULL,错误的“节点”,NULL);
sprintf(buff,“%i”,树节点->值);
xmlNewProp(xmlNode,BAD_CAST“value”,BAD_CAST buff);
对于(i=0;ichildrenCount;i++)
{
buildXml(xmlNode和treeNode->children[i]);
}
}
xmlDocPtr createDoc(节点*treeRoot)
{
xmlDocPtr doc=NULL;
xmlNodePtr rootNode=NULL;
doc=xmlNewDoc(BAD_CAST“1.0”);
rootNode=xmlNewNode(NULL,错误的“树”);
xmlDocSetRootElement(doc,rootNode);
buildXml(rootNode,treeRoot);
退货单;
}
int main()
{
节点*根;
xmlDocPtr xmlDoc;
root=createTree();
xmlDoc=createDoc(根);
//将结果打印到控制台
xmlSaveFormatFileEnc(“-”,xmlDoc,“UTF-8”,1);
}
此代码使用一般的n元树。如果您的树是二进制的,那么代码几乎是相同的