[序列化协议] --- XML

简介: [序列化协议] --- XML

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使用注意

  1. 新目录需要一个头文件标准

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

version不可以省略

encoding可以省略

  1. 使用注意事项
    必须有一个根节点,且只有一个
    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>


相关文章
|
3月前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
48 1
|
7月前
|
XML JSON 分布式计算
如何选择序列化协议:关键因素与场景分析
如何选择序列化协议:关键因素与场景分析
65 0
|
7月前
|
XML 存储 JSON
c#XML、JSON的序列化和反序列化,看完你就懂了
c#XML、JSON的序列化和反序列化,看完你就懂了
110 0
|
7月前
|
存储 JSON 网络协议
【计算机网络】序列化,反序列化和初识协议
【计算机网络】序列化,反序列化和初识协议
|
7月前
|
C++
[序列化协议] --- protobuf
[序列化协议] --- protobuf
63 0
|
7月前
|
JSON 数据格式 C++
[序列化协议] --- JSON
[序列化协议] --- JSON
77 0
|
7月前
|
XML JSON Linux
[序列化协议] --- 简介
[序列化协议] --- 简介
63 0
|
7月前
|
存储 JSON 编解码
IM通讯协议专题学习(十):初识 Thrift 序列化协议
本文将带你一起初步认识Thrift的序列化协议,包括Binary协议、Compact协议(类似于Protobuf)、JSON协议,希望能为你的通信协议格式选型带来参考。
155 1
|
7月前
|
XML 存储 JSON
C# 对象存储 (轻松实现序列化 | Xml | Json | 加密 | 压缩 | 注册表 | Redis)
开发时经常会遇到需要保存配置的情况,最常见的实现方式是将对象序列化成Json,再写入文件并保存到本地磁盘。 本文将使用开源库**ApeFree.DataStore**来替换原有的对象存储过程,实现一个可以随意切换存储方式的对象存储方法。 ApeFree.DataStore是一款可配置的对象存储库,支持在不同平台/介质中对内存中的对象进行存储与还原(如本地存储、注册表存储)。支持配置序列化格式(如Json、Xml),支持配置压缩算法(如GZip、Defalte),支持配置加密算法(如AES、RSA)。
131 0
C# 对象存储 (轻松实现序列化 | Xml | Json | 加密 | 压缩 | 注册表 | Redis)
|
22天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。

相关课程

更多