C语言 使用libxml解析 生成和解析xml
发布时间:2020-12-16 09:13:43 所属栏目:百科 来源:网络整理
导读:##安装 libxml libxml是一个用来解析XML文档的函数库。它用C语言写成,并且能为多种语言所调用 ###下载libxml 貌似libxml官方已经被河蟹掉了。没关系这里有 libxml的下载地址 2.7.4 ###下载之后解压 tar -zxvf libxml2-2.7.4.tar.gz 安装 cd libxml2-2.7.4 .
##安装 libxml libxml是一个用来解析XML文档的函数库。它用C语言写成,并且能为多种语言所调用 ###下载libxml 貌似libxml官方已经被河蟹掉了。没关系这里有 libxml的下载地址 2.7.4 ###下载之后解压 tar -zxvf libxml2-2.7.4.tar.gz 安装
##写测试代码 ###生成xml的代码 int main(int argc,char **argv) { xmlDocPtr doc = NULL; xmlNodePtr root_node = NULL,node = NULL,node1 = NULL; doc = xmlNewDoc(BAD_CAST "1.0"); root_node = xmlNewNode(NULL,BAD_CAST "root"); xmlDocSetRootElement(doc,root_node); xmlNewChild(root_node,NULL,BAD_CAST "node1",BAD_CAST "content of node1"); node=xmlNewChild(root_node,BAD_CAST "node3",BAD_CAST"node has attributes"); xmlNewProp(node,BAD_CAST "attribute",BAD_CAST "yes"); node = xmlNewNode(NULL,BAD_CAST "node4"); node1 = xmlNewText(BAD_CAST"other way to create content"); xmlAddChild(node,node1); xmlAddChild(root_node,node); xmlSaveFormatFileEnc(argc > 1 ? argv[1] : "-",doc,"UTF-8",1); xmlFreeDoc(doc); xmlCleanupParser(); xmlMemoryDump(); return(0); } 编译 :gcc -I /usr/local/include/libxml2 -L /usr/local/lib -lxml2 test.c -o test 执行./test 解析xml新建待解析xml,文件内容: <?xml version="1.0"?> <story> <storyinfo> <author>John Fleck</author> <datewritten>June 2,2002</datewritten> <keyword>example keyword</keyword> </storyinfo> <body> <headline>This is the headline</headline> <para>This is the body text.</para> </body> </story> ###解析的c语言代码 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <libxml/xmlmemory.h> #include <libxml/parser.h> void parseStory (xmlDocPtr doc,xmlNodePtr cur) { xmlChar *key; cur = cur->xmlChildrenNode; while (cur != NULL) { if ((!xmlStrcmp(cur->name,(const xmlChar *)"keyword"))) { key = xmlNodeListGetString(doc,cur->xmlChildrenNode,1); printf("keyword: %sn",key); xmlFree(key); } cur = cur->next; } return; } static void parseDoc(char *docname) { xmlDocPtr doc; xmlNodePtr cur; doc = xmlParseFile(docname); if (doc == NULL ) { fprintf(stderr,"Document not parsed successfully. n"); return; } cur = xmlDocGetRootElement(doc); cur = xmlDocGetRootElement(doc); if (cur == NULL) { fprintf(stderr,"empty documentn"); xmlFreeDoc(doc); return; } if (xmlStrcmp(cur->name,(const xmlChar *) "story")) { fprintf(stderr,"document of the wrong type,root node != story"); xmlFreeDoc(doc); return; } cur = cur->xmlChildrenNode; while (cur != NULL) { if ((!xmlStrcmp(cur->name,(const xmlChar *)"storyinfo"))){ parseStory (doc,cur); } cur = cur->next; } xmlFreeDoc(doc); return; } int main(int argc,char **argv) { char *docname; if (argc <= 1) { printf("Usage: %s docnamen",argv[0]); return(0); } docname = argv[1]; parseDoc (docname); return (1); } ###编译 gcc keyword.c -o keyword -I/usr/local/include/libxml2 -lxml2 ###运行 ./keyword story.xml 参考博文 http://www.52php.cn/article/p-rdtnxufp-bh.html http://www.cnblogs.com/shanzhizi/archive/2012/07/09/2583739.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |