libmxml (Mini

您所在的位置:网站首页 loadfile读取xml失败 libmxml (Mini

libmxml (Mini

2024-07-15 04:56:23| 来源: 网络整理| 查看: 265

      今天我们来简单介绍一下,关于xml的一些内容,包括自己编写一些程序进行生成和解析。

首先我们我们还是从xml的演化历史来了解一下它吧。

历史演化

GML:

         在20世纪60年代为了促进数据交换和操作,通过IBM公司研究人员的杰出工作,得出了重要的结论:要提高系统的移植性,必须采用一种通用的文档格式,这种文档的格式必须遵守特定的规则。这也就是创建通用标记语言(外语全称:Generalized Markup Language、外语缩写:GML)的指导原则,从人们所产生的将文件结构化为标准的格式的动机出发,IBM创建了GML。GML是一种IBM格式化文档语言,用于就其组织结构、各部件及其之间的关系进行文档描述。GML将这些描述标记为章节、重要小节和次重要小节(通过标题的级来区分)、段落、列表、表等。GML在文档具体格式方面,为文档员提供了一些方便,他们不必再为IBM得打印机格式化语言SCRIPT要求的字体规范、行距以及页面设计等浪费精力。GML是标准通用标记语言的先驱和基础,SGML是当今创建结构化文档描述语言规则的战略集合。很多网页是用HTML标记表示出的,就是使用GML概念创建文档的例子。扩展标志语言(XML)也根源于GML。 

SGML :

        它源于1969年IBM公司开发的文档描述语言GML,GML主要用来解决不同系统中文档格式不同的问题。后经过多年发展,1986年经ISO批准为国际标准ISO8897,并被称为SGML。制定SGML的基本思想是把文档的内容与样式分开。在SGML中,标记分两种:一种用来描述文档显示的样式,称为程序标记;另一种用来描述文档中语句的用途,称为描述标记。一个SGML文件通常分三个层次:结构、内容和样式。结构为组织文档的元素提供框架,内容是信息本身,样式控制内容的显示。SGML的平台无关性、结构化、可扩展等特性,使得它使用范围很广,被许多大型公司开始用来创建和发布信息。

HTML :

         超文本标记语言(HTML)起源于标准通用标记语言(SGML),由世界上最大的粒子物理研究实验室欧洲核子研究中心CERN(the European Organization for Nuclear Research)于1991年首先提出,是推动Web迅速发展的原动力。在互联网发展的早期,为了在各种网络环境之间、不同文件格式之间进行交流,在SGML基础上,CERN提出了超文本标记语言(Hyper Text Markup Language,HTML)的概念。HTML是一种用来制作超文本文档的简单标记语言,它定义了一组标记符号(tag),对文件的内容进行标注,指出内容的输出格式,如字体大小、颜色、背景颜色、表格形式、各部分之间逻辑上的组织等,从而实现了文件格式的标准化。简单地说,HTMI。文件包含了文档数据和显示样式两部分,其中文档数据是显示在Web浏览器中的数据内容,显示样式则规定了这些内容在浏览器中以何种格式、样子呈现给用户。通过统一使用支持HTMI。的浏览

软件,用户可以在任意异构的网络环境中阅读同一个文件,得到相同的显示结果,并可以对文件进行跳跃式阅读,展现了很强的表现力。 

XML:

        XML是由互联网联盟(World Wide Web Consortium,W3C)的XML工作组定义的。 “扩展标记语言(XML)是SGML的子集,其目标是允许普通的SGML在Web上以目前HTML的方式被服务、接收和处理。XML被设计成易于实现,且可在SGML和HTML之间互相操作。” HTML的出现极大地推动了世界范围内的互联网的发展,万维网就是一个主要成果。然而,HTML在某些方面是一种通用编码的倒退。 第一,HTML为了获得精简编码方式的有效性,而抛弃了通用编码的一些基本原则。例如,通用编码要求一个文档类型能用于任何目的,要求用户编码时应重载标签而不是重新定义特殊目的的标签。 

XML特点和作用 :

     XML 指可扩展标识语言( eXtensible Markup Language)

     XML 的设计宗旨是传输数据, 而非显示数据

     XML 标签没有被预定义。 您需要自行定义标签。

     作为一种通用的数据存储和通信格式被广泛应用。

    描述的数据作为一棵树型的结构而存在。

第一个简单的xml文件 :

Tove Jani Reminder Don't forget me this weekend!

规则说明:它定义 XML 的版本(1.0)和所使用的编码 UTF-8,version不可省略,encoding可以省略; 

描述文档的根元素,有且只有一个根元素。 

所有 XML 元素都须有关闭标签 

XML标签对大小写敏感。 

XML元素 :      XML元素指的是开始标签直到结束标签的部分,可以包含文本、属性、其他元素 中的一种或者多种。 比如下面这个xml文件 

Harry Potter J K. Rowling 2005 29.99 Learning XML Erik T. Ray 2003 39.95

上面的示例中 都有元素内容 因为他们包含其他元素。 元素也有属性category="WEB", 有文本内容。

下面正式介绍在linux下安装以及代码实现(我们下面介绍的依赖XML解析库是minixml),首先下载mxml的压缩包,并进行解压,解压后进入目录执行如图所示命令进行编译,

编译后我们进行代码测试需要的三个文件分别是 libmxml.a mxml.h config.h,将其拷贝到代码编写目录。

附mxml解析库下载地址:http://www.msweet.org/downloads.php?L+Z3

我们还是从mxml的函数开始介绍,才能事半功倍

minixml常用函数接口:

均需要包含头文件 #include  

创建一个新xml文件 :

mxml_node_t *mxmlNewXML(const char *version);

参数1:version默认传入"1.0"即可

返回值:返回新创建的xml文件节点

提示: 虽然xml中可以指定字符编码, 但是在mxml中默认的编码就是UTF8编码。 

其中一个节点新增节点 :

mxml_node_t *mxmlNewElement(mxml_node_t *parent, const char *name); 

参数1:父节点指针

参数2:新节点名称

返回值:返回新创建的子节点

设置节点属性名和值 :

void mxmlElementSetAttr(mxml_node_t *node, const char *name,const char *value);

参数1:被设置的节点的地址

参数2:设置的属性名

参数3:设置的属性值 

创建结点的文本 :

mxml_node_t *mxmlNewText ( mxml_node_t *parent, int whitespace, const char*string);

参数1: 被设置的结点的地址

参数2: 1 = leading whitespace, 0 = no whitespace

参数3: 文本 保存节点到xml文件 :

int mxmlSaveFile(mxml_node_t *node, FILE *fp,mxml_save_cb_t cb); 

参数1:node表示希望被保存的xml节点树的根节点, 指向xml结构的节点指针

参数2:fp为C中使用fopen函数打开文件所返回的FILE类型的指针

参数3:默认情况下使用MXML_NO_CALLBACK即可

删除节点内存 :

mxmlDelete(mxml_node_t *node); 

参数1:node为指向节点树的指针。

该函数将释放node节点指针所指向的整棵节点树, 而不用我们去一个一个节点释放。 如果该节点还有父节点, 会从节点树中先使用mxmlRemove()移除该节点。

从文件中加载xml :

mxml_node_t *mxmlLoadFile(mxml_node_t *top, FILE *fp,mxml_type_t (*cb)(mxml_node_t *));

参数1:top为加载的节点的父节点 如果是文档节点则填NULL即可

参数2:fopen函数返回的文件的指针

参数3:默认情况下使用MXML_NO_CALLBACK即可

从一个字符串中加载XML:

mxmlLoadString(mxml_node_t *top, const char *s, mxml_type_t (*cb)(mxml_node_t *));

第一个和第三个参数和 mxmlLoadFile()用法一样. 第二个参数指定了指定了字符串或者字符缓冲区用于加载XML,当父节点参数为NULL时内容必须为完整的XML文档,包括

XML头?xml元素.

获取节点属性 :

const char *mxmlElementGetAttr(mxml_node_t *node, const char *name); 

参数1:node为指向结点树的指针

参数2:name为获取的属性名

返回值:指定属性名的属性

获取指定节点的文本内容:

 const char *mxmlGetText(mxml_node_t *node, int *whitespace); 

跳转到下一个节点 :

mxml_node_t *mxmlWalkNext(mxml_node_t *node, mxml_node_t *top,int descend);

遍历到XML树中的下一个逻辑节点。

node 当前节点

top 顶级节点

descend参数有三个备选项

MXML_NO_DESCEND含义是不查看任何的子节点在XML元素层次中, 仅查看同层级的节点或者父节点直到到达根节点或者top节点.

MXML_DESCEND_FIRST含义是向下搜索到一个节点的第一个匹配子节点, 但不再继续向下搜索。 你一般使用于遍历一个父节点的直接的子节点。

MXML_DESCEND含义是可以一直向下搜索.

查找节点 :

mxml_node_t *mxmlFindElement(mxml_node_t *node, mxml_node_t *top,const char *name, const char *attr,const char *value, int descend);

node节点为被查找的结点

top为顶层结点

name, attrr, value为NULL时表示任意匹配; 否则为精确匹配。name :节点名 attrr:属性 value:属性值

descend同上个接口使用方式。 介绍了那么多了,下面终于要进入到具体的代码编程实现当中了

首先我们实现一个生成一个简单的xml文件的功能,代码1如下:

#include"mxml.h" int main() { //创建一个xml文件 mxml_node_t *xml = mxmlNewXML("1.0"); //新增一个节点html mxml_node_t *html = mxmlNewElement(xml,"html"); //在html节点下新增一个head节点 mxml_node_t *head = mxmlNewElement(html,"head"); //在head节点下新增一个title节点 mxml_node_t *title = mxmlNewElement(head,"title"); //title节点添加内容"Docment" mxmlNewText(title,0,"Docment"); //在html节点下新增body节点 mxml_node_t *body = mxmlNewElement(html,"body"); //在body节点下新增p节点 mxml_node_t *p = mxmlNewElement(body,"p"); //给p节点增加属性style,属性内容为 color:red mxmlElementSetAttr(p,"style","color:red"); //给p节点增加内容 Helloworld.cpp mxmlNewText(p,0,"Helloworld.cpp"); //打开文件index.xml FILE *fp = fopen("index.xml","wb"); //保存节点到xml文件 mxmlSaveFile(xml,fp,MXML_NO_CALLBACK); fclose(fp); //删除节点内存 mxmlDelete(xml); return 0; } 首先执行如上图所示命令进行编译,生成可执行程序,然后执行程序,看到生成index.xml文件,vim打开查看该xml文件

下面我们实现一个生成另一个xml文件的功能,代码2如下:

#include #include"mxml.h" int main(void) { FILE *fp = fopen("new.xml","w"); //生成xml文件的头 mxml_node_t *xml = mxmlNewXML("1.0"); //添加一个新节点note mxml_node_t *note = mxmlNewElement(xml,"note"); //往note节点添加子节点to mxml_node_t *to = mxmlNewElement(note,"to"); //给to节点添加文本内容 mxmlNewText(to,0,"科比"); //给to节点设置属性 time 属性内容为 1115 mxmlElementSetAttr(to,"time","1115"); //给note节点添加子节点from mxml_node_t *from = mxmlNewElement(note,"from"); //给from节点添加文本内容 mxmlNewText(from,0,"瓦妮莎"); //给note节点添加子节点heading mxml_node_t *heading = mxmlNewElement(note,"heading"); //给heading节点添加文本内容 mxmlNewText(heading,0,"Reminder"); //给note节点添加子节点body mxml_node_t *body = mxmlNewElement(note,"body"); //给body节点添加文本内容 mxmlNewText(body,0,"Don't froget NBA programe this weekend!"); //保存节点内容 mxmlSaveFile(xml,fp,MXML_NO_CALLBACK); fclose(fp); return 0; }使用下面的命令进行编译,生成可执行程序,然后执行程序,生成xml文件,可以用vim打开查看

前面两个都是介绍生成xml文件的案例,下面我们看几个解析已知的xml文件的例子

解析已有的xml文件,提取出信息代码3:

#include #include"mxml.h" int main(void) { FILE* fp = fopen("prac.xml","r"); //从prac.xml文件中加载xml mxml_node_t *xml = mxmlLoadFile(NULL,fp,MXML_NO_CALLBACK); //定义两个空节点 mxml_node_t *book = NULL; mxml_node_t *title = NULL; //从xml开始向下查找 name=book attrr=category book = mxmlFindElement(xml,xml,"book","category",NULL,MXML_DESCEND); while(book) { //获取title子元素的文本 book元素的属性 title = mxmlFindElement(book,xml,"title",NULL,NULL,MXML_DESCEND); if(title == NULL) { printf("title not found\n"); continue; } else { printf("book'titele is %s\n",mxmlGetText(title,NULL)); printf("book'category:%s\n",mxmlElementGetAttr(book,"category")); book = mxmlFindElement(title,xml,"book","category",NULL,MXML_DESCEND); } } mxmlDelete(xml); fclose(fp); return 0; }

已知的xml文件如下所示:

Harry.Potter JK.Rowling 2005 29.99 LearningXML ErikT.Ray 2003 39.95 执行如下命令进行编译,执行程序,即可看到解析出的xml信息

上面都是练手的,下面我们来点实际的,解析一下QQ数据试试

代码4如下:

#include #include"mxml.h" int main(void) { FILE *fp = fopen("QQ.xml","r"); //加载文件 mxml_node_t *xml = mxmlLoadFile(NULL,fp,MXML_NO_CALLBACK); //创建三个空节点 mxml_node_t *pic = NULL; mxml_node_t *resurl = NULL; mxml_node_t *thumbnail = NULL; //查找Pic元素 pic = mxmlFindElement(xml,xml,"Pic",NULL,NULL,MXML_DESCEND); while(pic) { resurl = mxmlFindElement(pic,xml,"resurl","md5",NULL,MXML_DESCEND); if(resurl == NULL) { printf("resurl == NULL"); } else { printf("md5 == %s\n",mxmlElementGetAttr(resurl,"md5")); printf("text:%s\n",mxmlGetText(resurl,NULL)); } thumbnail = mxmlFindElement(pic,xml,"thumbnail","md5",NULL,MXML_DESCEND); if(resurl == NULL) { printf("thumbnail == NULL"); } else { printf("md5 == %s\n",mxmlElementGetAttr(thumbnail,"md5")); printf("text:%s\n",mxmlGetText(thumbnail,NULL)); } pic = mxmlFindElement(pic,xml,"Pic",NULL,NULL,MXML_DESCEND); } mxmlDelete(xml); fclose(fp); return 0; }QQ数据的xml文件 http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/720V2/chat_bg_101_720.jpg http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/thumb/chatbg_thumb_101..png http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/720V2/chat_bg_102_720.jpg http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/thumb/chatbg_thumb_102..png http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/720V2/chat_bg_103_720.jpg http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/thumb/chatbg_thumb_103..png http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/720V2/chat_bg_104_720.jpg http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/thumb/chatbg_thumb_104..png http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/720V2/chat_bg_105_720.jpg http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/thumb/chatbg_thumb_105..png http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/720V2/chat_bg_106_720.jpg http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/thumb/chatbg_thumb_106..png http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/720V2/chat_bg_107_720.jpg http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/thumb/chatbg_thumb_107..png http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/720V2/chat_bg_108_720.jpg http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/thumb/chatbg_thumb_108..png http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/720V2/chat_bg_109_720.jpg http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/thumb/chatbg_thumb_109..png http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/720V2/chat_bg_110_720.jpg http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/thumb/chat_bg_thumb_110..png http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/720V2/chat_bg_111_720.jpg http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/thumb/chatbg_thumb_111..png 编译程序,执行可执行程序,得到如下图所示结果:

http://www.cnblogs.com/liunianshiwei/p/6086577.html



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭