c语言解析xml函数 c语言解析xml报文

c语言如何解析xml并将所有内容存入数组

/* 前段时间恰好做过类似的东西,代码可以给你参考下。

创新互联主要从事网站设计、成都网站设计、网页设计、企业做网站、公司建网站等业务。立足成都服务南昌县,十多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220

*  Xml配置见最后

*/

typedef struct SrcFileFmt

{

int   ColID;

char  ColCode[64];      /* 字段英文名称 */

char  ColName[128];     /* 字段中文名称*/

char  ColType[20];      /* 字段类型(包含长度) */

char  ColComment[128];  /* 字段描述 */

}SrcFileFmt;

int main(int argc, char **argv)

{

SrcFileFmt SrcFileFmt[128];

int iNum = -1;

if ( 2  argc )

{

printf("Usage: %s SrcXmlFile\n", argv[0]);

return -1;

}

iNum = parseSourceCfg(SrcCfgFile, SrcFileFmt);

if (iNum == -1)

{

return -1;

}

return 0;

}

/* 调用此函数后,xml文件的内容会被存储到结构体数组SrcFileFmt srcfilefmt[]中

* 此函数依赖于libxml2-2.9.2.tar.xz

*/

int parseSourceCfg(char *FileName, SrcFileFmt srcfilefmt[])

{ /* 解析源文件xml,FileName 为源xml文件名 */

xmlDocPtr doc;

xmlNodePtr cur, root;

char sFileName[64] = {'\0'};

int cnt = 0;

if (FileName == NULL)

{

return -1;

}

sprintf(sFileName, "%s.xml", FileName);

doc = xmlParseFile(sFileName);

if (doc == NULL)

{

return -1;

}

root = xmlDocGetRootElement(doc);

if (root == NULL) {

xmlFreeDoc(doc);

return(-1);

}

if (xmlStrcmp(root-name, (const xmlChar *) "SrcRoot"))

{

xmlFreeDoc(doc);

return -1;

}

cur = root-xmlChildrenNode;

while (cur != NULL) 

{

if ((!xmlStrcmp(cur-name, (const xmlChar *)"Column")))

{

xmlChar *key;

xmlNodePtr cur_sub = cur;

cur_sub = cur_sub-xmlChildrenNode;

while (cur_sub != NULL) 

{

if ((!xmlStrcmp(cur_sub-name, (const xmlChar *)"ColID"))) {

key = xmlNodeListGetString(doc, cur_sub-xmlChildrenNode, 1);

killblank((char*)key);

srcfilefmt[cnt].ColID = atoi((char*)key);

xmlFree(key);

}

if ((!xmlStrcmp(cur_sub-name, (const xmlChar *)"ColCode"))) {

key = xmlNodeListGetString(doc, cur_sub-xmlChildrenNode, 1);

killblank((char*)key);

strcpy(srcfilefmt[cnt].ColCode, (char*)key);

xmlFree(key);

}

else if ((!xmlStrcmp(cur_sub-name, (const xmlChar *)"ColName"))) {

key = xmlNodeListGetString(doc, cur_sub-xmlChildrenNode, 1);

killblank((char*)key);

strcpy(srcfilefmt[cnt].ColName, (char*)key);

xmlFree(key);

}

else if ((!xmlStrcmp(cur_sub-name, (const xmlChar *)"ColType"))) {

key = xmlNodeListGetString(doc, cur_sub-xmlChildrenNode, 1);

killblank((char*)key);

strcpy(srcfilefmt[cnt].ColType, (char*)key);

xmlFree(key);

}

else if ((!xmlStrcmp(cur_sub-name, (const xmlChar *)"ColComment"))) {

key = xmlNodeListGetString(doc, cur_sub-xmlChildrenNode, 1);

killblank((char*)key);

strcpy(srcfilefmt[cnt].ColComment, (char*)key);

xmlFree(key);

}

cur_sub = cur_sub-next;

}

cnt++;

}

cur = cur-next;

}

xmlFreeDoc(doc); 

return cnt;

}

SrcRoot

Column

ColID1/ColID

ColCodekmh/ColCode

ColName字段1/ColName

ColTypeVARCHAR(11)/ColType

/Column

Column

ColID2/ColID

ColCodedfkmh/ColCode

ColName字段2/ColName

ColTypeVARCHAR(11)/ColType

/Column

Column

ColID3/ColID

ColCodehbh/ColCode

ColName字段3/ColName

ColTypeINTEGER(10)/ColType

/Column

/SrcRoot

C语言实现的XML解析器[2]

//////////////////////////////////////////////////// /// 说明 : 解析XML文件 返回XML的根节点 /// 参数 : /// : xml xml文件路径 [in] /// : buffer 供解析用的缓冲 [in] /// : buffer_len 缓冲大小(单位:字节) [in] /// : error_reason 执行出错时保存错误原因 [in] /// : root XML的根节点 [out] /// 返回 : 成功 返回 失败返回 /// 说明 : /// : 问 :供解析用的缓冲应该取多大比较合适呢? /// : 答 :供解析用的缓冲主要用来存放XML树 所以 buffer_len = (XML文件的大小) * 即可 /// :

int mini_parse_xml (char* xml char* buffer int buffer_len char error_reason[ ] MINI_XML_NODE** root);

//////////////////////////////////////////////////// /// 说明 : 查找特定节点的子节点 /// 参数 : /// : father 父结点 [in] /// : name 子孩子节点名 [in] /// : child 子节点 [out]

int mini_find_child (MINI_XML_NODE* father char* name MINI_XML_NODE** child);

//////////////////////////////////////////////////// /// 说明 : 查找特定节点的属性值 /// 参数 : /// : node 节点 [in] /// : name 属性名 [in] /// : value 属性值 [out]

int mini_find_attribute (MINI_XML_NODE* node char* name char** value);

//////////////////////////////////////////////////// /// 说明 : 打印XML树 供调试用 int mini_print_tree (MINI_XML_NODE* root int layer);

#if defined (__cplusplus) || defined (c_plusplus) } #endif #endif

lishixinzhi/Article/program/net/201311/14908

用C语言读取xml文件,怎么实现?

xml文件和txt文件相同,使用普通的文本操作函数即可读取。

1、C语言标准库提供了一系列文件操作函数。文件操作函数一般以f+单词的形式来命名(f是file的简写),其声明位于stdio.h头文件当中。例如:fopen、fclose函数用于文件打开与关闭;fscanf、fgets函数用于文件读取;fprintf、fputs函数用于文件写入;ftell、fseek函数用于文件操作位置的获取与设置。

2、例程:

#includestdio.h

int a;

char b,c[100];

int main(){

FILE * fp1 = fopen("input.xml", "r");//打开xml格式输入文件

FILE * fp2 = fopen("output.txt", "w");//打开输出文件

if (fp1==NULL || fp2==NULL) {//若打开文件失败则退出

puts("不能打开文件!");

rturn 0;

}

fscanf(fp1,"%d",a);//从输入文件读取一个整数

b=fgetc(fp1);//从输入文件读取一个字符

fgets(c,100,fp1);//从输入文件读取一行字符串

printf("%ld",ftell(fp1));//输出fp1指针当前位置相对于文件首的偏移字节数

fputs(c,fp2);//向输出文件写入一行字符串

fputc(b,fp2);//向输出文件写入一个字符

fprintf(fp2,"%d",a);//向输出文件写入一个整数

fclose(fp1);//关闭输入文件

fclose(fp2);//关闭输出文件,相当于保存

return 0;

}

C语言xml解析

把所有的数据当做一个字符串

收到数据后先strstr(buffer,"?xml version=\"1.0\" encoding=\"UTF-8\"?");

如果返回的是NULL则表示没有这段 退出

buffer是你收到的数据起始地址


分享题目:c语言解析xml函数 c语言解析xml报文
浏览地址:http://pwwzsj.com/article/ddgidsg.html