C дерево XML сериализация - PullRequest
0 голосов
/ 20 июля 2011

В настоящее время я пытаюсь рекурсивно пройтись по древовидной структуре и сериализовать ее в строку, используя (язык) C. Я настоящий новичок, когда дело доходит до C (Исходя из Java, C #, action-scriptфон), и у меня возникают проблемы с общением с вещами в целом.

Должен ли я использовать библиотеку, чтобы помочь сгенерировать XML?Как реализовать рекурсию с помощью C?

Спасибо

Ответы [ 2 ]

5 голосов
/ 20 июля 2011

Должен ли я использовать библиотеку, чтобы помочь сгенерировать XML?

Да. libxml , minixml и другие.Просто Google, чтобы узнать других, но я бы пошел с libxml.

Как реализовать рекурсию с помощью C?

Ну, реализовать рекурсию само по себе очень просто.Например, это рекурсивно:

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

Проблема в том, насколько сложным вы хотите быть.Но для XML используйте библиотеку.

1 голос
/ 21 июля 2011

Используя 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-арное дерево. Если ваше дерево является двоичным, код будет почти таким же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...