您的位置:首页 > 其它

XML简单解析程序__C实现

2009-07-19 21:11 459 查看
最近一段时间总是用C和WEBSERVICE进行一些数据的交互,所以不得不用XML这些东西,用C写死分析程序总是不太好,稍做更改就是改程序,太麻烦。

所以,在用这些之前,自已写了点XML的解析小测试,感觉不是很难,拿出来和大家分享,如果您是高手,请不要见笑,如果您从中学到了点东西,那我非常高兴,不妥之处警请指正:

#include <libxml/xmlreader.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <stdlib.h>

#define TEST

char * get_xml_value(xmlTextReaderPtr reader);
char * get_xml_key(xmlTextReaderPtr reader);
int parse_xml(const char *xml_buf, int xml_buf_size);

#ifdef TEST
int main()
{

char *xml_buf = "<xmlTest xmlns=/"http://www.openuri.org//"><userName>1234567</userName><dstFolder>dddd</dstFolder><subject>test</subject></xmlTest>";
parse_xml(xml_buf, strlen(xml_buf)); /*这里只是测试,不对返回值做判断*/
return 0;
}
#endif

/*分解提交过来的XML串,当然也可以是一个文件,只要更改相关调用函数*/
int parse_xml(const char *xml_buf, int xml_buf_size)
{
int ret = 0;
int node_depth = 0;
int node_type = 0;
xmlTextReaderPtr xml_reader;

xml_reader = xmlReaderForMemory(xml_buf, xml_buf_size, NULL, NULL, 0);
if (NULL == xml_reader) {
return -1;
}

while (1 == (ret = xmlTextReaderRead(xml_reader))) {

/*  这块是判断节点深度的,您可以对分解深度做一个限制
node_depth = xmlTextReaderDepth(xml_reader);
if (5 < node_depth) {
ret = -2;
break;
}
*/

/*判断当前节点的类型*/
node_type = xmlTextReaderNodeType(xml_reader);
switch(node_type) {
case 1:
get_xml_key(xml_reader);
break;
case 3:
get_xml_value(xml_reader);
break;

}
}

xmlFreeTextReader(xml_reader);
return ret;
}

/*取得当前节点的KEY值*/
char * get_xml_key(xmlTextReaderPtr reader)
{
const xmlChar *key;
key = xmlTextReaderConstName(reader);
if (NULL == key) {
return NULL;
}
printf("KEY : %s/n", key);
}
/*取得当前节点的VALUE值*/
char * get_xml_value(xmlTextReaderPtr reader)
{
const xmlChar *value;

value = xmlTextReaderConstValue(reader);
if (NULL == value) {
return NULL;
}
printf("VALUE : %s/n", value);
}


上述程序,结果一运行遍知。

前提是您必须安装LIBXML的库,可到http://xmlsoft.org/去下载,上面有详细的文档。

编译时要指定LIBXML的头文件路径和库的路径

gcc -I/xxx/libxml/include/libxml2 -L/xxx/libxml/lib -lxml2 -g -o target source.c

引用:http://blog.chinaunix.net/u/18768/showart_316081.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: