




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 编写说明本文档主要介绍XML的基本知识及利用如何利用libxml来操作xml文件。2 XML基础XML(Extensible Markup Language)即可扩展标记语言,它与HTML一样,都是SGML(Standard Generalized Markup Language,标准通用标记语言)。Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。扩展标记语言XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立。 XML 中共有12种节点类型,其中最常见的节点类型有5种:元素:元素是 XML 的基本组成单元。,描述XML的基本信息。属性:属性节点包含关于元素节点的信息,通常包含在元素里面,描述元素的属性。文本:包含许多文本信息或者只是空白。文档:文档节点是整个文档中所有其它节点的父节点。注释:注释是对相关的信息进行描述、注释。xml的解析一般都是用j2se提供的API来解析,在linux下有两种方法来解析,一个是DOM(document object Model ),文档对象模型法,还有就是简单API(simple API for XML,SAX)。DOM中的核心概念就是节点。DOM在分析XML文档时,将将组成XML文档的各个部分(元素、属性、文本、注释、处理指令等)映射为一个对象(节点)。在内存中,这些节点形成一课文档树。整棵树是一个节点,树中的每一个节点也是一棵树(子树),可以说,DOM就是对这棵树的一个对象描述,我们通过访问树中的节点来存取XML文档的内容。SAX是一种基于事件驱动的API。利用SAX解析XML文档,牵涉到两个部分:解析器和事件处理器。解析器负责读取XML文档,并向事件处理器发生事件,如元素开始和元素结束事件;而事件处理器则负责对事件做出响应,对传递的XML数据进行处理DOM 虽然是 W3C 的标准,提供了标准的解析方式,但它的解析效率一直不尽如人意,因为使用DOM解析XML时,解析器读入整个文档并构建一个驻留内存的树结构(节点树),然后您的代码才可以使用 DOM 的标准接口来操作这个树结构。但大部分情况下我们只对文档的部分内容感兴趣,根本就不用先解析整个文档,并且从节点树的根节点来索引一些我们需要的数据也是非常耗时的。相比于文档对象模型DOM,SAX 是读取和操作 XML 数据的更快速、更轻量的方法。SAX 允许您在读取文档时处理它,从而不必等待整个文档被存储之后才采取操作。它不涉及 DOM 所必需的开销和概念跳跃。 SAX API是一个基于事件的API ,适用于处理数据流,即随着数据的流动而依次处理数据。SAX API 在其解析您的文档时发生一定事件的时候会通知您。在您对其响应时,您不作保存的数据将会 被抛弃。SAX不必事先将整个XML文档加载到内存中,因此它占据内存要比DOM小,对于大型的XML文档来说,通常会使用SAX而不是DOM进行解析。3 LibXml介绍需求安装包:libxml2 和libxm2-devel,其中libxml主要包括.so文件,libxml2-devel包括开发文档和所有的.h文件。Linux下可用rpm ql 命令查看,rpm qd可查看文档信息。3.1 数据类型xmlChar在libXml中用xmlCha替代char,XML使用UTF-8编码的一字节字符串。如果你的数据使用其它编码,它必须被转换到UTF-8才能使用libxml的函数。转码函数需用到libiconv库中的ConvertEncoding()函数。如同标准c中的char类型一样,xmlChar也有动态内存分配、字符串操作等相关函数。例如xmlMalloc是动态分配内存的函数;xmlFree是配套的释放内存函数等等。基本上动态内存分配函数xmlmemory.h中定义。而为了方便对xmlChar类型字符串的操作,libxml提供了自己的函数,它们的定义于标准c函数库中的字符串函数很像,xmlChar字符串相关函数都在xmlstring.h中定义:xmlChar* xmlStrcat (xmlChar *cur, const xmlChar * add)const xmlChar *xmlStrchr(const xmlChar * str, xmlChar val)int xmlStrcmp (const xmlChar * str1, const xmlChar * str2)int xmlStrlen (const xmlChar * str)xmlChar *xmlStrncat (xmlChar * cur, const xmlChar * add, int len)int xmlStrncmp (const xmlChar * str1, const xmlChar * str2, int len)const xmlChar *xmlStrstr (const xmlChar * str, const xmlChar * val)另外要注意,因为总是要在xmlChar*和char*之间进行类型转换,所以定义了一个宏BAD_CAST,其定义如下:xmlstring.h#define BAD_CAST (xmlChar *)原则上来说,unsigned char和char之间进行强制类型转换是没有问题的。3.2 DOM对象模型解析简介3.2.1 重要数据结构XmlDoc:代表DOM结构中的文档类型。包含由解析文档建立的树结构,xmlDocPtr是指向这个结构的指针。xmlNode:代表DOM结构中的除文档类型类型外的其它节点类型。包含单一结点的结构,xmlNodePtr是指向这个结构的指针,它被用于遍历文档树。节点应该是xml中最重要的元素了,xmlNode代表了xml文档中的一个节点,实现为一个struct,内容很丰富:tree.htypedef struct _xmlNode xmlNode;typedef xmlNode *xmlNodePtr;struct _xmlNode void *_private; xmlElementType type; const xmlChar *name; struct _xmlNode *children; struct _xmlNode *last; struct _xmlNode *parent; struct _xmlNode *next; struct _xmlNode *prev; struct _xmlDoc *doc; xmlNs *ns; xmlChar *content; struct _xmlAttr *properties; xmlNs *nsDef; void *psvi; unsigned short line; unsigned short extra;可以看到,节点之间是以链表和树两种方式同时组织起来的,next和prev指针可以组成链表,而parent和children可以组织为树。所有节点都是文档XmlDoc节点的直接或间接子节点。同时还有以下重要元素:节点中的文字内容:content;节点所属文档:doc;节点名字:name;节点的namespace:ns;节点属性列表:properties;Xml文档的操作其根本原理就是在节点之间移动、查询节点的各项信息,并进行增加、删除、修改的操作。xmlDocSetRootElement函数可以将一个节点设置为某个文档的根节点,这是将文档与节点连接起来的重要手段,当有了根结点以后,所有子节点就可以依次连接上根节点,从而组织成为一个xml树。3.2.2 创建XML文档创建一个xml文档流程如下:l 用xmlNewDoc函数创建一个文档指针doc;l 用xmlNewNode函数创建一个节点指针root_node;l 用xmlDocSetRootElement将root_node设置为doc的根结点;l 给root_node添加一系列的子节点,并设置子节点的内容和属性;l 用xmlSaveFile将xml文档存入文件;l 用xmlFreeDoc函数关闭文档指针,并清除本文档中所有节点动态申请的内存示例代码:#include #include #include int main(int argc , char *argv) xmlDocPtr pdoc = NULL; xmlNodePtr proot_node = NULL ,pnode = NULL , pnode1 = NULL; / 创造一个新文档并设置要root节点 / 在XML文档中有且只有一个root节点 pdoc = xmlNewDoc( BAD_CAST 1.0); proot_node = xmlNewNode(NULL , BAD_CAST plist); xmlNewProp(proot_node , BAD_CAST version , BAD_CAST 1.0); xmlDocSetRootElement(pdoc , proot_node); pnode = xmlNewNode( NULL , BAD_CAST dict ); / 创造root节点的子节点 xmlNewChild(pnode , NULL , BAD_CAST key , BAD_CAST info); pnode1 = xmlNewNode( NULL , BAD_CAST dict );/保存文档 xmlSaveFormatFileEnc(argc 1 ? argv1 : -, pdoc, UTF-8, 1);/释放文档指针 xmlFreeDoc(pdoc); xmlCleanupParser(); xmlMemoryDump(); /debug memory for regression tests return(0);涉及相关函数:xmlNewDoc,xmlNewNode,xmlDocSetRootElement,xmlSaveFile,xmlFreeDoc。3.2.3 解释文档解析一个xml文档,从中取出想要的信息,例如节点中包含的文字,或者某个节点的属性,其流程如下:l 用xmlReadFile函数读出一个文档指针doc;l 用xmlDocGetRootElement函数得到根节点curNode;l curNode-xmlChildrenNode就是根节点的子节点集合;l 轮询子节点集合,找到所需的节点,用xmlNodeGetContent取出其内容;l 用xmlHasProp查找含有某个属性的节点;l 取出该节点的属性集合,用xmlGetProp取出其属性值;l 用xmlFreeDoc函数关闭文档指针,并清除本文档中所有节点动态申请的内存。注意:节点列表的指针依然是xmlNodePtr,属性列表的指针也是xmlAttrPtr,并没有xmlNodeList或者xmlAttrList这样的类型。看作列表的时候使用它们的next和prev链表指针来进行轮询。只有在Xpath中有xmlNodeSet这种类型,其使用方法前面已经介绍了。示例代码:int main(int argc , char *argv) xmlDocPtr pdoc = NULL; xmlNodePtr proot=NULL , pcurnode = NULL; char *psfilename; if (argc name , BAD_CAST plist) != 0) printf(error document ); exit(1); if(xmlHasProp(pcurnode ,BAD_CAST version) xmlChar *szAttr = xmlGetProp(pcurnode, BAD_CAST version);printf(get version : %s n , szAttr); xmlFreeDoc(pdoc); xmlCleanupParser();return 0;涉及函数:xmlParseFile,xmlReadFile,xmlDocGetRootElement,xmlHasProp,xmlGetProp。其中xmlParseFile和xmlReadFile都具备打开XML文件的功能,xmlParseFile函数以默认方式读入一个UTF-8格式的文档,并返回文档指针。xmlReadFile函数读入一个带有某种编码的xml文档,并返回文档指针。3.2.4 修改XML有了上面的基础,修改xml文档的内容就很简单了。首先打开一个已经存在的xml文档,顺着根结点找到需要添加、删除、修改的地方,调用相应的xml函数对节点进行增、删、改操作。示例代码:#include int main(int argc, char* argv) xmlDocPtr doc; /定义解析文档指针 xmlNodePtr curNode; /定义结点指针(你需要它为了在各个结点间移动) char *szDocName; if (argc children; while (NULL != curNode) /删除newNode1 if (!xmlStrcmp(curNode-name, BAD_CAST newNode1) xmlNodePtr tempNode; tempNode = curNode-next; xmlUnlinkNode(curNode); xmlFreeNode(curNode); curNode = tempNode; continue; /修改node2的属性值 if (!xmlStrcmp(curNode-name, BAD_CAST node2) xmlSetProp(curNode,BAD_CAST attribute, BAD_CAST no); /修改newNode2的内容 if (!xmlStrcmp(curNode-name, BAD_CAST newNode2) xmlNodeSetContent(curNode, BAD_CAST content changed); /增加一个属性 if (!xmlStrcmp(curNode-name, BAD_CAST newNode3) xmlNewProp(curNode, BAD_CAST newAttr, BAD_CAST YES); /增加一个子节点 if (!xmlStrcmp(curNode-name, BAD_CAST son) xmlNewTextChild(curNode, NULL, BAD_CAST newGrandSon, BAD_CAST new content); curNode = curNode-next;3.3 SAX简单API解析3.3.1相关函数简介libxml库提供还提供了一些函数以流的形式来读取并分析xml文件.xmlTextReader xmlTextReaderPtr /XmlReader的结构体及其指针xmlTextReaderPtr xmlReaderForFile (const char * filename, const char * encoding, int options) /打开一个xml文件并返回xmlreader对象,准备开始分析.int xmlTextReaderRead (xmlTextReaderPtr reader) /读取下一个节点(注意,是下一个,不是下一个同层节点)int xmlTextReaderNext (xmlTextReaderPtr reader) /读取下一个同层节点int xmlTextReaderNodeType (xmlTextReaderPtr reader) /判断当前节点的类型xmlChar *xmlTextReaderGetAttribute (xmlTextReaderPtr reader, const xmlChar * name) /获取当前节点的指定属性xmlChar *xmlTextReaderReadString (xmlTextReaderPtr reader) /读取当前节点下的textxmlNodePtr xmlTextReaderExpand (xmlTextReaderPtr reader) /将当前节点展开成一个节点对象(慎用)int xmlTextReaderHasValue (xmlTextReaderPtr reader) /判断当前节点是否有text值int xmlTextReaderHasAttributes (xmlTextReaderPtr reader) /判断当前节点是否包含属性int xmlTextReaderMoveToAttribute (xmlTextReaderPtr reader, const xmlChar * name) /移动指针到当前节点的指定属性名的属性int xmlTextReaderMoveToAttributeNo (xmlTextReaderPtr reader, int no) /移动指针到当前节点指定属性编号的属性int xmlTextReaderMoveToElement (xmlTextReaderPtr reader) /将指针移会当前节点int xmlTextReaderMoveToFirstAttribute (xmlTextReaderPtr reader) /将指针移动到当前节点的第一属性int xmlTextReaderMoveToNextAttribute (xmlTextReaderPtr reader) /将指针移动到当前节点的下一属性xmlChar *xmlTextReaderName (xmlTextRead
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江海职业技术学院《学院通选课传统文化艺术》2023-2024学年第二学期期末试卷
- 内蒙古商贸职业学院《论文写作与工程伦理》2023-2024学年第二学期期末试卷
- 辽宁师范大学《游泳课保健》2023-2024学年第二学期期末试卷
- 厦门大学《外国文学史下》2023-2024学年第二学期期末试卷
- 宁波城市职业技术学院《空间设计与制作》2023-2024学年第二学期期末试卷
- 山西省太原市小店区一中2025年高三下第一次(4月)月考物理试题含解析
- 山东枣庄八中2024-2025学年高三下学期第四次模拟考试英语试题试卷含解析
- 吉林省第二实验校2024-2025学年初三下学期质量调查(一)数学试题含解析
- 江苏省连云港市东海县2025届高三下学期第二次模拟(二模)考试数学试题试卷含解析
- 吉林省长春市外国语学校2025届高三下学期第二次验收考试化学试题试卷含解析
- 【工程法规】王欣 教材精讲班课件 39-第6章-6.4-施工现场安全防护制度
- 重难点18 球的切、接问题(举一反三)(新高考专用)(教师版) 2025年高考数学一轮复习专练(新高考专用)
- 职业心理健康课件
- 电子测量仪器的微机电系统技术考核试卷
- 亚洲弦歌-深情 课件 2024-2025学年人音版(简谱)(2024)初中音乐七年级上册
- 【产业图谱】2024年广州市重点产业规划布局全景图谱(附各地区重点产业、产业体系布局、未来产业发展规划等)
- 2024年云南省昆明市盘龙区小升初英语试卷
- 温室大棚钢结构安装方案
- 2024-2030年中国宠物殡葬服务行业市场深度调研及发展战略与投资前景研究报告
- 2024-2030年中国军用掩蔽系统行业市场发展趋势与前景展望战略分析报告
- 2024年山东省淄博市淄川区小中考二模生物试题(解析版)
评论
0/150
提交评论