1. XML 简介
1.1 什么是XML
- XML 指可扩展标记语言(EXtensible Markup Language)。
- XML 是一种很像HTML的标记语言。
- XML 的设计宗旨是传输数据,而不是显示数据。
- XML 标签没有被预定义。您需要自行定义标签。
- XML 被设计为具有自我描述性。
- XML 是 W3C 的推荐标准。
1.2 XML 和 HTML 之间的差异
- XML 不是 HTML 的替代。
- XML 和 HTML 为不同的目的而设计:
- XML 被设计用来传输和存储数据,其焦点是数据的内容
- HTML 被设计用来显示数据,其焦点是数据的外观
- HTML 旨在显示信息,而 XML 旨在传输信息。
1.3 XML基础语法和规范
这里只是简单的提供一个示例,具体语法规则可以参看
https://www.w3school.com.cn/xml/xml_syntax.asp
https://www.runoob.com/xml/xml-syntax.html
<!-- 注释 --> <!-- 文件头 --> <?xml version="1.0" encoding="UTF-8"?> <!--树状结构的标签 --> <!--根标签,随便起名,不重复即可 --> <!-- 标签一定是成对出现 --> <!-- 标签大小写敏感 --> <root> <!-- 子标签--> <student> <name>zhangsan</name> <!-- 可以为标签设置单独的属性 --> <age really="yes">20</age> <sex>man</sex> <address>shanghai</address> </student> <student> <name>lisi</name> <age>22</age> <sex>woman</sex> <address>shanghai</address> </student> </root>
2. 如何使用XML开源库
2.1 minixml开源库安装配置
github上开源库比较多,这里采用minixml进行理解使用。 minixml github链接,http://www.msweet.org/projects.php/Mini-XML
minixml配置安装步骤如下:
./configure --prefix=/usr/mylib
make
sudo make install
2.2 xml使用注意
- 新目录需要一个头文件标准
<?xml version="1.0" encoding="utf-8"?>
version不可以省略
encoding可以省略
- 使用注意事项
必须有一个根节点,且只有一个
xml标签对大小写敏感
标签成对使用
2.3 借助开源库,在程序中生成xml文件
生成xml文件API介绍
1> 创建一个新的xml文件
mxml_node_t *mxmlNewXML(const char * version)
返回新创建的xml文件节点
默认的文件编码是utf8
2> 删除节点内存
void mxmlDelete(mxml_node_t *node)
3> 添加一个新的节点
mxml_node_t *mxmlNewElement(
mxml_node_t *parent, //父节点
const char *name //新节点标签名);
4> 设置节点的属性名和属性值
void mxmlElementSetAttr(
mxml_not_t * node, //被设置属性的节点
const char * name, //节点的属性名
const char * value //属性值);
5> 创建节点的文本内容
mxml_node_t *mxmlNewText(
mxml_node_t * parent, //节点地址
int whitespace, //是否有空白
const char * string //文本内容
6> 保存节点到xml文件
int mxmlSaveFile(
mxml_node_t * node, //根节点
FILE *fp, //文件指针
mxml_save_cb_t cb //默认MXML_NO_CALLBACK)
create.c
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include "mxml.h" int main(void) { mxml_node_t * root = mxmlNewXML("1.0"); //文件头 //根标签 chain mxml_node_t * china = mxmlNewElement(root, "china"); //子标签 city mxml_node_t * city = mxmlNewElement(china, "city"); mxml_node_t * info = mxmlNewElement(city, "name"); //标签赋值 mxmlNewText(info, 0, "北京"); //设置属性 mxmlElementSetAttr(info, "isbig", "yes"); //面积 info = mxmlNewElement(city, "area"); mxmlNewText(info, 0, "16410 平方公里"); //人口 info = mxmlNewElement(city, "population"); mxmlNewText(info, 0, "2171万"); //GDP info = mxmlNewElement(city, "gpd"); mxmlNewText(info, 0, "24510万亿"); //标签赋值 mxmlNewText(info, 0, "东京"); //设置属性 mxmlElementSetAttr(info, "isbig", "no"); //面积 info = mxmlNewElement(city, "area"); mxmlNewText(info, 0, "2040 平方公里"); //人口 info = mxmlNewElement(city, "population"); mxmlNewText(info, 0, "211万"); //GDP info = mxmlNewElement(city, "gpd"); mxmlNewText(info, 0, "2451亿"); //保存数据到磁盘文件 FILE *fp = fopen("china.xml", "w"); mxmlSaveFile(root, fp, MXML_NO_CALLBACK); fclose(fp); mxmlDelete(root); return 0; }
编译运行输出:
2.3 已知一个xml文件,借助开源库解析xml文件数据
#include <stdio.h> #include "mxml.h" int main(int argc, char **argv) { if(argc < 2) { printf("./a.out filename\n"); return 0; } //加载xml文件 FILE *fp = fopen(argv[1], "r"); mxml_node_t * root = mxmlLoadFile(NULL, fp, MXML_NO_CALLBACK); //找到第一个factory节点 mxml_node_t * factory = mxmlFindElement(root, root, "factory", "name", NULL, MXML_DESCEND); //循坏查找 while(factory) { //打印几点的属性值 printf("factory attr: %s\n", mxmlElementGetAttr(factory, "name")); //向下移动一个节点 mxml_node_t * brand = mxmlWalkNext(factory, root, MXML_DESCEND); while(brand) { mxml_node_t * node = mxmlWalkNext(brand, root, MXML_DESCEND_FIRST); printf(" name %s \n", mxmlGetText(node, 0)); //color node = mxmlWalkNext(node, root, MXML_NO_DESCEND); printf(" color %s \n", mxmlGetText(node, 0)); //price node = mxmlWalkNext(node, root, MXML_NO_DESCEND); printf(" price %s \n", mxmlGetText(node, 0)); //找到下一个品牌节点 brand = mxmlFindElement(brand, root, "brand", NULL, NULL, MXML_NO_DESCEND); } //打印厂家对应的车辆品牌和属性信息 //查找下一个节点 factory = mxmlFindElement(factory, root, "factory", "name", NULL, MXML_NO_DESCEND); } mxmlDelete(root); fclose(fp); return 0; }
对应的xml文件如下:
<?xml version="1.0" encoding="utf-8"?> <car> <factory> <name>一汽大众</name> <brand> <name>高尔夫</name> <color>红色</color> <price>15</price> </brand> <brand> <name>大众</name> <color>白色</color> <price>25</price> </brand> </factory> <factory> <name>长城</name> <brand> <name>哈佛</name> <color>黑色</color> <price>22</price> </brand> <brand> <name>长城大炮</name> <color>白色</color> <price>40</price> </brand> </factory> </car>