Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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_Microxml - Fatal编程技术网

C 从XML文件提取数据

C 从XML文件提取数据,c,xml,microxml,C,Xml,Microxml,我使用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)

我使用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;
}
#包括
int main()
{
文件*fp;
mxml_node_t*树,*数据,*b;
int action_num1;
fp=fopen(文件路径,“r”);
如果(fp!=NULL){
tree=mxmloadfile(NULL、fp、MXML\u NO\u回调);
如果(!tree)返回-1;
fclose(fp);
}
否则返回-1;
data=mxmlFindElement(树,树,“第一个节点”,NULL,NULL,MXML);
如果(!data)转到错误;
fp=fopen(文件路径,“w”);
如果(fp!=NULL){
b=mxmlNewElement(数据,“动作”);
如果(!b)转到错误;
n=b;
b=mxmlNewElement(n,“动作编号”);
如果(!b)转到错误;
b=mxmlNewInteger(b,123);
如果(!b)转到错误;
b=mxmlNewElement(n,“动作类型”);
如果(!b)转到错误;
b=mxmlNewInteger(b,1);
如果(!b)转到错误;
mxmlSaveFile(树、fp、MXML_NO_回调);
fclose(fp);
mxmlDelete(树);
返回0;
}
fp=fopen(文件路径,“r”);
如果(fp!=NULL){
tree=mxmloadfile(NULL、fp、MXML\u NO\u回调);
如果(!tree)返回-1;
fclose(fp);
}
否则返回-1;
data=mxmlFindElement(树,树,“第一个节点”,NULL,NULL,MXML);
如果(!data)转到错误;
b=数据;
而(二){
如果(b->type==MXML\u元素&&
!strcmp(b->value.element.name,“操作”)){
c=mxmlFindElement(b,b,“动作编号”,NULL,NULL,MXML);
如果(!c)转到错误1;
如果(c->type==MXML\u元素&&
c->儿童
c->child->type==MXML\u整数){
action_num1=mxmlGetInteger(c);`/**==>获取整数值**`
}
}
b=mxmlWalkNext(b,数据,MXML_);
}
错误:
关闭(fp);
mxmlDelete(树);
返回-1;
错误1:
mxmlDelete(树);
返回-1;
}

问题是当我得到整数值时,它的值是0(不要得到“action_number”的值)。当我使用mxmlGetText函数处理字符串值时,这个问题不存在

似乎是
mxmloadfile的默认行为(NULL、fp、MXML\u NO\u回调)将所有字段视为文本。尝试以下操作以查看发生了什么:

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\u INTEGER\u callback
(如果只保存整数)

如果希望混合整数、文本和实数,应该编写自己的回调函数

再见


Francis

应该是
c
还是
c->child
?c和c->child的结果是一样的请参见网站中的函数代码:您最好用更少的代码重新生成相同的问题,并在此处哑化xml和代码。当从文件加载xml树并使用函数mxmlGetInteger()获取整数值时,会出现此问题是,从文件加载xml树时,所有字段都被视为文本!!