今天我们来简单介绍一下,关于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文件 :   

 <?xml version="1.0" encoding="utf-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

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

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

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

    XML标签对大小写敏感。

XML元素 :

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

 <?xml version="1.0" encoding="utf-8"?>
<bookstore><bookstore>
<book category="CHILDREN">
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title>Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>

上面的示例中<bookstore> <book>都有元素内容 因为他们包含其他元素。 <book>元素也有属性category="WEB", <title> <author> <year> <price>有文本内容。


下面正式介绍在linux下安装以及代码实现(我们下面介绍的依赖XML解析库是minixml),首先下载mxml的压缩包,并进行解压,解压后进入目录执行如图所示命令进行编译,编译后我们进行代码测试需要的三个文件分别是 libmxml.a mxml.h config.h,将其拷贝到代码编写目录。

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

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

minixml常用函数接口:

  均需要包含头文件 #include <mxml.h>
  
    创建一个新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即可

    获取节点属性 :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时表示任意匹配; 否则为精确匹配。
        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,,"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,,"Helloworld.cpp"); //打开文件index.xml
FILE *fp = fopen("index.xml","wb");
//保存节点到xml文件
mxmlSaveFile(xml,fp,MXML_NO_CALLBACK);
fclose(fp);
//删除节点内存
mxmlDelete(xml);
return ;
}

首先执行如上图所示命令进行编译,生成可执行程序,然后执行程序,看到生成index.xml文件,vim打开查看该xml文件

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

 #include<stdio.h>
#include"mxml.h" int main(void)
{
FILE *fp = fopen("new.xml","w"); //生成xml文件的头 <?xml version="1.0" encoding="utf-8"?>
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,,"科比");
//给to节点设置属性 time 属性内容为 1115
mxmlElementSetAttr(to,"time",""); //给note节点添加子节点from
mxml_node_t *from = mxmlNewElement(note,"from");
//给from节点添加文本内容
mxmlNewText(from,,"瓦妮莎");
//给note节点添加子节点heading
mxml_node_t *heading = mxmlNewElement(note,"heading");
//给heading节点添加文本内容
mxmlNewText(heading,,"Reminder"); //给note节点添加子节点body
mxml_node_t *body = mxmlNewElement(note,"body");
//给body节点添加文本内容
mxmlNewText(body,,"Don't froget NBA programe this weekend!");
//保存节点内容
mxmlSaveFile(xml,fp,MXML_NO_CALLBACK); fclose(fp);
return ;
}

使用下面的命令进行编译,生成可执行程序,然后执行程序,生成xml文件,可以用vim打开查看

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

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

 #include<stdio.h>
#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 ;
}

已知的xml文件如下所示:

 <?xml version="1.0" encoding="utf-8"?>
<bookstore>
<book category="CHILDREN">
<title>Harry.Potter</title>
<author>JK.Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title>LearningXML</title>
<author>ErikT.Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>

执行如下命令进行编译,执行程序,即可看到解析出的xml信息


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

代码4如下:

 #include<stdio.h>
#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 ;
}

QQ数据的xml文件

 <?xml version="1.0" encoding="utf-8"?>

 <!--pkgName对应GetResourceRespInfo的strPkgName字段-->
<!--version对应GetResourceRespInfo的uiNewVer字段-->
<PicArray version="1" pkgName="QQCHATPic_hdpi" >
<Pic>
<!-- 原图地址-->
<resurl md5 = "qq2013_chatbg101_hdpi">http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/720V2/chat_bg_101_720.jpg</resurl>
<!-- 缩略图地址-->
<thumbnail md5 = "qq2013_chatbg_thumb_101">http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/thumb/chatbg_thumb_101..png</thumbnail>
</Pic>
<Pic>
<!-- 原图地址-->
<resurl md5 = "qq2013_chatbg102_hdpi">http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/720V2/chat_bg_102_720.jpg</resurl>
<!-- 缩略图地址-->
<thumbnail md5 = "qq2013_chatbg_thumb_102">http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/thumb/chatbg_thumb_102..png</thumbnail>
</Pic>
<Pic>
<!-- 原图地址-->
<resurl md5 = "qq2013_chatbg103_hdpi">http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/720V2/chat_bg_103_720.jpg</resurl>
<!-- 缩略图地址-->
<thumbnail md5 = "qq2013_chatbg_thumb_103">http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/thumb/chatbg_thumb_103..png</thumbnail>
</Pic> <Pic>
<!-- 原图地址-->
<resurl md5 = "qq2013_chatbg104_hdpi">http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/720V2/chat_bg_104_720.jpg</resurl>
<!-- 缩略图地址-->
<thumbnail md5 = "qq2013_chatbg_thumb_104">http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/thumb/chatbg_thumb_104..png</thumbnail>
</Pic> <Pic>
<!-- 原图地址-->
<resurl md5 = "qq2013_chatbg105_hdpi">http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/720V2/chat_bg_105_720.jpg</resurl>
<!-- 缩略图地址-->
<thumbnail md5 = "qq2013_chatbg_thumb_105">http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/thumb/chatbg_thumb_105..png</thumbnail>
</Pic> <Pic>
<!-- 原图地址-->
<resurl md5 = "qq2013_chatbg106_hdpi">http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/720V2/chat_bg_106_720.jpg</resurl>
<!-- 缩略图地址-->
<thumbnail md5 = "qq2013_chatbg_thumb_106">http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/thumb/chatbg_thumb_106..png</thumbnail>
</Pic> <Pic>
<!-- 原图地址-->
<resurl md5 = "qq2013_chatbg107_hdpi">http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/720V2/chat_bg_107_720.jpg</resurl>
<!-- 缩略图地址-->
<thumbnail md5 = "qq2013_chatbg_thumb_107">http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/thumb/chatbg_thumb_107..png</thumbnail>
</Pic> <Pic>
<!-- 原图地址-->
<resurl md5 = "qq2013_chatbg108_hdpi">http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/720V2/chat_bg_108_720.jpg</resurl>
<!-- 缩略图地址-->
<thumbnail md5 = "qq2013_chatbg_thumb_108">http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/thumb/chatbg_thumb_108..png</thumbnail>
</Pic>
<Pic>
<!-- 原图地址-->
<resurl md5 = "qq2013_chatbg109_hdpi">http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/720V2/chat_bg_109_720.jpg</resurl>
<!-- 缩略图地址-->
<thumbnail md5 = "qq2013_chatbg_thumb_109">http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/thumb/chatbg_thumb_109..png</thumbnail>
</Pic>
<Pic>
<!-- 原图地址-->
<resurl md5 = "qq2013_chatbg1101_hdpi">http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/720V2/chat_bg_110_720.jpg</resurl>
<!-- 缩略图地址-->
<thumbnail md5 = "qq2013_chatbg_thumb_1101">http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/thumb/chat_bg_thumb_110..png</thumbnail>
</Pic>
<Pic>
<!-- 原图地址-->
<resurl md5 = "qq2013_chatbg1112_hdpi">http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/720V2/chat_bg_111_720.jpg</resurl>
<!-- 缩略图地址-->
<thumbnail md5 = "qq2013_chatbg_thumb_1112">http://appimg1.3g.qq.com/msoft/mobileQQ_theme/new_background/thumb/chatbg_thumb_111..png</thumbnail>
</Pic>
</PicArray>

编译程序,执行可执行程序,得到如下图所示结果:

下面我们再来解析一个天气情况的xml文件来熟悉一下函数使用,代码5如下:

 #include <stdio.h>
#include "mxml.h" int main(void)
{
FILE *fp = fopen("weather.xml","rb");
mxml_node_t *xml = mxmlLoadFile(NULL,fp,MXML_NO_CALLBACK);
mxml_node_t *city = NULL;
city = mxmlFindElement(xml,xml,"city",NULL,NULL,MXML_DESCEND);
while(city)
{
printf("省市名称:%s \n",mxmlElementGetAttr(city,"quName"));
printf("省会名称:%s \n",mxmlElementGetAttr(city,"cityname")); printf("最低气温:%s \n",mxmlElementGetAttr(city,"tem1"));
printf("最高气温:%s \n",mxmlElementGetAttr(city,"tem2")); printf("天气情况:%s \n",mxmlElementGetAttr(city,"stateDetailed"));
printf("风力:%s \n\n",mxmlElementGetAttr(city,"windState"));
city = mxmlFindElement(city,xml,"city",NULL,NULL,MXML_DESCEND);
} return ;
}

天气的xml文件如下所示:

 <?xml version="1.0" encoding="UTF-8"?>
<china dn="nay">
<city quName="黑龙江" pyName="heilongjiang" cityname="哈尔滨" state1="1" state2="1" stateDetailed="多云" tem1="17" tem2="21" windState="东南风小于3级"></city>
<city quName="吉林" pyName="jilin" cityname="长春" state1="21" state2="4" stateDetailed="小到中雨转雷阵雨" tem1="16" tem2="20" windState="东南风转西北风小于3级"></city>
<city quName="辽宁" pyName="liaoning" cityname="沈阳" state1="1" state2="4" stateDetailed="多云转雷阵雨" tem1="15" tem2="26" windState="西南风小于3级"></city>
<city quName="海南" pyName="hainan" cityname="海口" state1="1" state2="4" stateDetailed="多云转雷阵雨" tem1="26" tem2="33" windState="西南风3-4级"></city>
<city quName="内蒙古" pyName="neimenggu" cityname="呼和浩特" state1="1" state2="1" stateDetailed="多云" tem1="7" tem2="23" windState="西北风小于3级"></city>
<city quName="新疆" pyName="xinjiang" cityname="乌鲁木齐" state1="0" state2="0" stateDetailed="晴" tem1="18" tem2="29" windState="微风"></city>
<city quName="西藏" pyName="xizang" cityname="拉萨" state1="4" state2="1" stateDetailed="雷阵雨转多云" tem1="10" tem2="23" windState="微风"></city>
<city quName="青海" pyName="qinghai" cityname="西宁" state1="8" state2="3" stateDetailed="中雨转阵雨" tem1="7" tem2="20" windState="东南风小于3级"></city>
<city quName="宁夏" pyName="ningxia" cityname="银川" state1="2" state2="2" stateDetailed="阴" tem1="15" tem2="25" windState="微风"></city>
<city quName="甘肃" pyName="gansu" cityname="兰州" state1="7" state2="7" stateDetailed="小雨" tem1="14" tem2="24" windState="微风"></city>
<city quName="河北" pyName="hebei" cityname="石家庄" state1="1" state2="1" stateDetailed="多云" tem1="19" tem2="31" windState="北风转南风小于3级"></city>
<city quName="河南" pyName="henan" cityname="郑州" state1="0" state2="0" stateDetailed="晴" tem1="20" tem2="33" windState="微风"></city>
<city quName="湖北" pyName="hubei" cityname="武汉" state1="2" state2="7" stateDetailed="阴转小雨" tem1="21" tem2="29" windState="微风"></city>
<city quName="湖南" pyName="hunan" cityname="长沙" state1="3" state2="7" stateDetailed="阵雨转小雨" tem1="24" tem2="29" windState="北风小于3级"></city>
<city quName="山东" pyName="shandong" cityname="济南" state1="0" state2="1" stateDetailed="晴转多云" tem1="20" tem2="32" windState="南风小于3级"></city>
<city quName="江苏" pyName="jiangsu" cityname="南京" state1="1" state2="1" stateDetailed="多云" tem1="21" tem2="32" windState="东南风转东风小于3级"></city>
<city quName="安徽" pyName="anhui" cityname="合肥" state1="0" state2="1" stateDetailed="晴转多云" tem1="22" tem2="32" windState="北风小于3级"></city>
<city quName="山西" pyName="shanxi" cityname="太原" state1="1" state2="1" stateDetailed="多云" tem1="12" tem2="27" windState="微风"></city>
<city quName="陕西" pyName="sanxi" cityname="西安" state1="1" state2="2" stateDetailed="多云转阴" tem1="19" tem2="26" windState="东风小于3级"></city>
<city quName="四川" pyName="sichuan" cityname="成都" state1="7" state2="1" stateDetailed="小雨转多云" tem1="19" tem2="29" windState="微风"></city>
<city quName="云南" pyName="yunnan" cityname="昆明" state1="3" state2="3" stateDetailed="阵雨" tem1="17" tem2="24" windState="微风"></city>
<city quName="贵州" pyName="guizhou" cityname="贵阳" state1="2" state2="21" stateDetailed="阴转小到中雨" tem1="18" tem2="23" windState="东北风小于3级"></city>
<city quName="浙江" pyName="zhejiang" cityname="杭州" state1="1" state2="1" stateDetailed="多云" tem1="22" tem2="29" windState="东风小于3级转3-4级"></city>
<city quName="福建" pyName="fujian" cityname="福州" state1="3" state2="2" stateDetailed="阵雨转阴" tem1="25" tem2="31" windState="微风转东风小于3级"></city>
<city quName="江西" pyName="jiangxi" cityname="南昌" state1="1" state2="1" stateDetailed="多云" tem1="24" tem2="32" windState="微风"></city>
<city quName="广东" pyName="guangdong" cityname="广州" state1="4" state2="4" stateDetailed="雷阵雨" tem1="26" tem2="33" windState="微风"></city>
<city quName="广西" pyName="guangxi" cityname="南宁" state1="1" state2="3" stateDetailed="多云转阵雨" tem1="25" tem2="33" windState="东南风小于3级"></city>
<city quName="北京" pyName="beijing" cityname="北京" state1="0" state2="0" stateDetailed="晴" tem1="18" tem2="31" windState="微风"></city>
<city quName="天津" pyName="tianjin" cityname="天津" state1="0" state2="1" stateDetailed="晴转多云" tem1="20" tem2="31" windState="西南风转南风小于3级"></city>
<city quName="上海" pyName="shanghai" cityname="上海" state1="0" state2="1" stateDetailed="晴转多云" tem1="23" tem2="31" windState="南风转东北风小于3级"></city>
<city quName="重庆" pyName="chongqing" cityname="重庆" state1="8" state2="8" stateDetailed="中雨" tem1="20" tem2="23" windState="微风"></city>
<city quName="香港" pyName="xianggang" cityname="香港" state1="3" state2="3" stateDetailed="阵雨" tem1="26" tem2="30" windState="微风"></city>
<city quName="澳门" pyName="aomen" cityname="澳门" state1="3" state2="3" stateDetailed="阵雨" tem1="26" tem2="31" windState="微风"></city>
<city quName="台湾" pyName="taiwan" cityname="台北" state1="9" state2="10" stateDetailed="大雨转暴雨" tem1="26" tem2="30" windState="微风"></city>
<city quName="西沙" pyName="xisha" cityname="西沙" state1="1" state2="1" stateDetailed="多云" tem1="29" tem2="32" windState="西南风4-5级"></city>
<city quName="南沙" pyName="nanshadao" cityname="南沙" state1="4" state2="4" stateDetailed="雷阵雨" tem1="28" tem2="31" windState="西风5-6级"></city>
<city quName="钓鱼岛" pyName="diaoyudao" cityname="钓鱼岛" state1="7" state2="7" stateDetailed="小雨" tem1="26" tem2="28" windState="北风转东北风3-4级"></city>
</china>

编译程序,执行程序,如下图所示,由于内容较多,所以截图只有前半部分,结果已经出来了

以上就是基于mxml库的对于xml一些简单介绍,xml是很强大的,如果还想继续深入学习可以继续深入研究libmxml库,这里就介绍到这里。

xml简单介绍及libmxml编程的更多相关文章

  1. XML简单介绍及举例

    可扩展标记语言(eXtensibleMarkup Language,简称XML).是一种标记语言.标记指计算机所能理解的信息符号.通过此种标记,计算机之间能够处理包括各种信息的文章等. 怎样定义这些标 ...

  2. 四、testNG.xml 简单介绍

    TestNG定义了一套非常具体的术语描述测试. testng.xml testng.xml是一个以XML记录所有测试的文件.可以利用这个文件,跑同一个类或者多个不同类里面的测试用例. testng.x ...

  3. XML 简单介绍

    先附上一张XML 大概图:详解见博客内容. 一.定义 XML(EXtensible Markup Language) :可扩展标记语言. 设计的用途:用来描述,存储,传输数据信息. 二.特色 1.单纯 ...

  4. XML学习总结(2)——XML简单介绍

    一.XML概念 Extensible Markup Language,翻译过来为可扩展标记语言.Xml技术是w3c组织发布的,目前推荐遵循的是W3C组织于2000发布的XML1.0规范. 二.学习XM ...

  5. 1.xml简单介绍

    1.xml(eXtensible Markup Language)的简介 (1)xml: 可扩展标记型语言 - 标记型语言:例如html也是标记型语言,也是使用标签来操作的 - 可扩展:html里面的 ...

  6. XML简单介绍

    什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language). XML 是一种很像HTML的标记语言. XML 的设计宗旨是传输数据,而不是显示数据. XML 标 ...

  7. 元组的简单介绍——参考Python编程从入门到实践

    元组 用于存储一系列不可修改的元素 1. 元组的定义 dimensions = (200, 50) # 定义一个元组,即将元素用圆括号括起来 print(dimensions[0]) # 打印元组中的 ...

  8. 【浅墨著作】《OpenCV3编程入门》内容简单介绍&amp;勘误&amp;配套源码下载

    经过近一年的沉淀和总结,<OpenCV3编程入门>一书最终和大家见面了. 近期有为数不少的小伙伴们发邮件给浅墨建议最好在博客里面贴出这本书的文件夹,方便大家更好的了解这本书的内容.事实上近 ...

  9. FOR XML PATH 简单介绍

    FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...

随机推荐

  1. excel提取汉字拼音首字母

    本文转载:http://jingyan.baidu.com/article/63acb44adca44461fcc17e85.html 利用Excel表格中的宏,轻松提取首字母 方法/步骤 1.启动E ...

  2. ubuntu中vi编辑器键盘错乱的问题

    Ubuntu安装完成后vi编辑器键盘不能正常使用,使用下面方法解决: 编辑文件/etc/vim/vimrc.tiny,将“compatible”改成“nocompatible”非兼容模式: 并添加一句 ...

  3. PAT 甲级 1024 Palindromic Number

    1024. Palindromic Number (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A ...

  4. Python量化常用函数

    # -*- coding: utf-8 -*- # @Author: fangbei # @Date: 2017-08-26 # @Original: price_str = '30.14, 29.5 ...

  5. HBase-MR

    一.需求1:对一张表的rowkey进行计数 官方HBase-Mapreduce 需求1:对一张表的rowkey进行计数 1)导入环境变量 export HBASE_HOME=/root/hd/hbas ...

  6. Linux命令(基础2)

    1.命令概要介绍: 查看目录内容:ls 切换目录命令:cd 创建与删除目录:touch(创建文件).rm(移除文件与目录).mkdir(创建目录) 拷贝与移动命令:cp(拷贝).mv(移动) 查看文件 ...

  7. postman 断言

    //断言 pm.test("message等于'操作成功'", function () { var jsonData = pm.response.json(); console.l ...

  8. Swift学习——A Swift Tour 枚举和结构体

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zhenyu5211314/article/details/28588095 Enumerations ...

  9. 简明python教程八----输入/输出

    通过创建一个file类的对象来打开一个文件,分别使用file类的read.readline或write方法来读写文件. 最后调用一个close方法来告诉Python我们完成了对文件的使用. poem= ...

  10. Redis操作手册

    一.Redis简介 1.1 NoSQL NoSQL,泛指非关系型数据库,NoSQL数据库分为四大类:键值存储数据库(Redis,Voldemort,Oracle BDB).列存储数据库(HBase,R ...