linuxcxml编程2007-04-2318:27:04/个人分类:linuxc编程最近在做linuxcxml编程测试。在网络上似乎找不到太多的资料。我觉得的教程不错。给大家介绍一下。。是英文,不过很简单。相信做编程的人不会看不懂。。给出国内的一资料,写得也很不错。(程序我测试过了)使用简介数据类型:xmlChar替代char,使用UTF-8编码的一字节字符串。如果你的数据使用其它编码,它必须被转换到UTF-8才能使用libxml的函数。XmlDoc包含由解析文档建立的树结构,xmlDocPtr是指向这个结构的指针。xmlNodePtrandxmlNode包含单一结点的结构xmlNodePtr是指向这个结构的指针,它被用于遍历文档树。优点:1.安装、使用比较简单,容易入门;2.支持的编码格式较多,能很好的解决中文问题(使用一个很简单的编码转换函数);3.支持Xpath解析(这点对于任意定位xml文档中的节点还是很有用的哦);4.支持Well-formed和valid验证,具体而言支持DTD验证,Schema验证功能正在完善中(目前多数解析器都还不完全支持shema验证功能);5.支持目前通用的Dom、Sax方式解析等等。不足:1.指针太多,使用不当时就会出现错误,在Linux系统中表现为常见的段错误,同样管理不当易造成内存泄漏;2.个人认为内面有些函数的功能设计的不是很好(比如获取Xpath函数,它不获取节点属性,这样子有些情况会定位不准)。在学习libxml2中,最好的学习手册就是由官方开发者提供的开发手册就是libxml2-devel-2.6.19,rpm–q–dlibxml2获得文档路径,就是它了。关于xml开始研究LibXML2库之前,让我们先来巩固一下XML的相关基础。XML是一种基于文本的格式,它可用来创建能够通过各种语言和平台访问的结构化数据。它包括一系列类似HTML的标记,并以树型结构来对这些标记进行排列。例如,可参见清单1中介绍的简单文档。这是配置文件部分中研究的配置文件示例的简化版本。为了更清楚地显示XML的一般概念,所以对其进行了简化。清单1.一个简单的XML文件?xmlversion=1.0encoding=UTF-8?filesownerroot/owneractiondelete/actionageunits=days10/age/files清单1中的第一行是XML声明,它告诉负责处理XML的应用程序,即解析器,将要处理的XML的版本。大部分的文件使用版本1.0编写,但也有少量的版本1.1的文件。它还定义了所使用的编码。大部分文件使用UTF-8,但是,XML设计用来集成各种语言中的数据,包括那些不使用英语字母的语言。接下来出现的是元素。一个元素以开始标记开始(如files),并以结束标记结束(如/files),其中使用斜线(/)来区别于开始标记。元素是Node的一种类型。XML文档对象模型(DOM)定义了几种不同的Nodes类型,包括Elements(如files或者age)、Attributes(如units)和Text(如root或者10)。元素可以具有子节点。例如,age元素有一个子元素,即文本节点10。而files元素有七个子元素。其中三个很明显。它们分别是三个子元素:owner、action和age。其他四个分别是元素前后的空白文本符号。XML解析器可以利用这种父子结构来遍历文档,甚至修改文档的结构或内容。LibXML2是这样的解析器中的其中一种,并且文中的示例应用程序正是使用这种结构来实现该目的。对于各种不同的环境,有许多不同的解析器和库。LibXML2是用于UNIX环境的解析器和库中最好的一种,并且经过扩展,它提供了对几种脚本语言的支持,如Perl和Python。1tree/********************************************compile:gcc-I/usr/include/libxml2/-lxml2tree1.c*usage:createaxmltree********************************************/#includestdio.h#includelibxml/parser.h#includelibxml/tree.hintmain(intargc,char**argv){xmlDocPtrdoc=NULL;/*documentpointer*/xmlNodePtrroot_node=NULL,node=NULL,node1=NULL;/*nodepointers*///Createsanewdocument,anodeandsetitasarootnodedoc=xmlNewDoc(BAD_CAST1.0);root_node=xmlNewNode(NULL,BAD_CASTroot);xmlDocSetRootElement(doc,root_node);//createsanewnode,whichisattachedaschildnodeofroot_nodenode.xmlNewChild(root_node,NULL,BAD_CASTnode1,BAD_CASTcontentofnode1);//xmlNewProp()createsattributes,whichisattachedtoannode.node=xmlNewChild(root_node,NULL,BAD_CASTnode3,BAD_CASTnodehasattributes);xmlNewProp(node,BAD_CASTattribute,BAD_CASTyes);//Heregoesanotherwaytocreatenodes.node=xmlNewNode(NULL,BAD_CASTnode4);node1=xmlNewText(BAD_CASTotherwaytocreatecontent);xmlAddChild(node,node1);xmlAddChild(root_node,node);//DumpingdocumenttostdioorfilexmlSaveFormatFileEnc(argc1?argv[1]:-,doc,UTF-8,1);/*freethedocument*/xmlFreeDoc(doc);xmlCleanupParser();xmlMemoryDump();//debugmemoryforregressiontestsreturn(0);}生成的xml:[denny@localhostxml]$gcc-I/usr/include/libxml2/-lxml2tree1.c[denny@localhostxml]$./a.out?xmlversion=1.0encoding=UTF-8?rootnode1contentofnode1/node1node3attribute=yesnodehasattributes/node3node4otherwaytocreatecontent/node4/root执行序列:1声明指针:文档指针(xmlDocPtr),结点指针(xmlNodePtr);2生成文档doc:xmlNewDoc3生成根结点root_node:xmlNewDocNode,xmlNewNode4文档与根结点捆绑:xmlDocSetRootElement5结点操作1)创建子结点:xmlNewChild或xmlNewNode2)设置结点属性:xmlNewProp3)设置结点值:xmlNewText,xmlNewChild,xmlAddChild6释放内存:xmlFreeDoc,xmlMemoryDump7lib的载入退出:LIBXML_TEST_VERSION,xmlCleanupParser2parse对于应用程序来说,读取XML文件的第一步是加载该数据并将其解析为一个Document对象。在此基础上,可以对DOM树进行遍历以获取特定的节点。/********************************************compile:gcc-I/usr/include/libxml2/-lxml2tree1.c*usage:tree2filename_or_URL********************************************/#includestdio.h#includelibxml/parser.h#includelibxml/tree.h#ifdefLIBXML_TREE_ENABLEDstaticvoidprint_element_names(xmlNode*a_node){xmlNode*cur_node=NULL;for(cur_node=a_node;cur_node;cur_node=cur_node-next){if(cur_node-type==XML_ELEMENT_NODE){printf(nodetype:Element,name:%s\n,cur_node-name);}print_element_names(cur_node-children);}}/***Simpleexampletoparseafilecalledfile.xml,*walkdowntheDOM,andprintthenameofthe*xmlelementsnodes.*/intmain(intargc,char**argv){xmlDoc*doc=NULL;xmlNode*root_element=NULL;if(argc!=2)return(1);//LIBXML_TEST_VERSION/*parsethefileandgettheDOM*/doc=xmlReadFile(argv[1],NULL,0);if(doc==NULL){printf(error:couldnotparsefile%s\n,argv[1]);}/*Gettherootelementnode*/root_element=xmlDocGetRootElement(doc);print_element_names(root_element);/*freethedocument*/xmlFreeDoc(doc);//xmlCleanupParser();return0;}#elseintmain(void){fprintf(stderr,Treesupportnotcompiledin\n);exit(1);}#endif执行序列:1声明指针:文档指针(xmlDocPtr),结点指针(xmlNodePtr);2得到文档doc:xmlReadFile3得到根结点root_node:xmlDocGetRootElement4结点操作:1)获得到结点值:xmlNodeGetContent(对应于xmlFree)2)遍历:指向下一个结点:xmlNodePtr-children结点值:xmlNodePtr-name,结点内遍历:xmlNodePtr-next5释放内存:xmlFreeDoc,xmlFreeXML文件的解析--libxml库函数解释摘要Libxml是一个有免费许可的用于处理XML、可以轻松跨越多个平台的C语言库。这个指南提供它的基本函数的例子。绪论Libxml是一个实现读、创建及操纵XML数据功能的C语言库。这个指南提供例子代码并给出它基本功能的解释。在这个项目的主页上有Libxml及更多关于它可用的资料。包含有完整的API文档。这个指南并不能替代这些完整的文档,但是阐明功能需要使用库来完成基本操作。这个指南基于一个简单的XML应用,它使用我