0

Mini-XML を使用して、プロジェクトのデータを保存および処理しています。

これはコードです:

#include <microxml.h>

int main() 
{
    FILE *fp;
    mxml_node_t *tree, *data, *b;
    int action_num1;

    fp = fopen(FILE_PATH, "r");

    if (fp!=NULL) {
        tree = mxmlLoadFile(NULL, fp, MXML_NO_CALLBACK);
        if (!tree) return -1;
        fclose(fp);
    }
    else return -1;

    data = mxmlFindElement(tree, tree, "first_node", NULL, NULL, MXML_DESCEND);
    if (!data) goto error;
    fp = fopen(FILE_PATH, "w");
    if (fp!=NULL) {
        b = mxmlNewElement(data, "action");
        if (!b) goto error;
        n = b;
        b = mxmlNewElement(n, "action_number");
        if (!b) goto error;
        b = mxmlNewInteger(b, 123);
        if (!b) goto error;
        b = mxmlNewElement(n, "action_type");
        if (!b) goto error;
        b = mxmlNewInteger(b, 1);
        if (!b) goto error;

        mxmlSaveFile(tree, fp, MXML_NO_CALLBACK);
        fclose(fp);
        mxmlDelete(tree);
        return 0;
    }
    fp = fopen(FILE_PATH, "r");
    if (fp!=NULL) {
        tree = mxmlLoadFile(NULL, fp, MXML_NO_CALLBACK);
        if (!tree) return -1;
        fclose(fp);
    }
    else return -1;

    data = mxmlFindElement(tree, tree, "first_node", NULL, NULL, MXML_DESCEND);
    if (!data) goto error;

    b = data;
    while (b) {
        if (b->type == MXML_ELEMENT &&
            !strcmp(b->value.element.name, "action")) {

            c = mxmlFindElement(b, b, "action_number",NULL, NULL, MXML_DESCEND);
            if (!c) goto error1;
            if(c->type == MXML_ELEMENT &&
                       c->child
                   c->child->type == MXML_INTEGER) {
                action_num1 = mxmlGetInteger(c); `// **===> get integer value**` 
            }
      }
    b = mxmlWalkNext(b, data, MXML_DESCEND);
    }
error:
    close(fp);
    mxmlDelete(tree);
    return -1;

error1:
    mxmlDelete(tree);
    return -1;
}

問題は、整数値を取得すると値が0になることです(「action_number」の値を取得しないでください)。mxmlGetText 関数を使用して文字列値を処理する場合、この問題は発生しません。

4

1 に答える 1

0

のデフォルトの動作は、mxmlLoadFile(NULL, fp, MXML_NO_CALLBACK);すべてのフィールドをテキストと見なすようです。これを試して、何が起こったのかを確認してください:

printf("%d %d %d %d %d \n",c->type, MXML_INTEGER, MXML_ELEMENT,MXML_TEXT,c->child->type);       
if(c->type == MXML_ELEMENT ) {
   char* bla=mxmlGetText(c,NULL);
   action_num1 = mxmlGetInteger(c); // **===> get integer value**
   printf("found one integer %d %s\n",action_num1,bla);
}

MXML_INTEGER_CALLBACK整数のみを保存する場合、最も簡単な修正はコールバックに切り替えることです。

整数、テキスト、実数を混在させたい場合は、独自のコールバックを作成する必要があります。http://www.msweet.org/documentation/project3/Mini-XML.html#LOAD_CALLBACKS

さよなら、

フランシス

于 2014-01-03T15:27:40.213 に答える