libxml教程(图文详解)

缘起
我的CloudBox需要一个跨平台的方案来解决iOS上以及Android上的xml档案读取问题
因为游戏总是需要储存一些设定值,或是过关存档之类的
但又不能轻易的使用iOS内建提供的或著是Java内建提供的函数,这样整起来会很麻烦
而且思考到以后增加新的平台,会有不小的困扰,最后决定就用libxml
libxml又是可以在windows环境下使用的,因此直接用visual studio也可以轻易尝试学习API如何使用
环境简介
操作系统:
Windows XP
IDE工具: Visual Studio 2008
工程类型: Visual C++ Win32 Console Application
下载链接
lib及.h档下载链接
http://xmlsoft.org/sources/win32/
dll下载连结
http://www.dll-files.com/dllindex/dll-files.shtml?iconv
http://www.dll-files.com/dllindex/dll-files.shtml?zlib1
http://www.dll-files.com/dllindex/dll-files.shtml?libxml2
设定说明图解

如图所示,我在工程目录中创建了两个文件夹,在libxml中放了iconv跟libxml的.h文档
另外也创建了lib档,将所有的lib都放进去

然后再项目工程中设定libaray的文件路经跟include的文件路径
代码说明
1. 读取XML文档


代码如下:

xmlDocPtr doc; 
    xmlNodePtr root; 
    // load an exist xml file. 
    doc = xmlParseFile("test.xml"); 
    if (doc == NULL )  
    {  
        fprintf(stderr,"Document not parsed successfully. \n");  
        return 0;  
    }  
    // get root 
    root = xmlDocGetRootElement(doc); 
    if (root == NULL)  
    {  
        fprintf(stderr,"empty document\n");  
        xmlFreeDoc(doc); 
        return 0; 
    }

xmlDoc是一个struct,保存了一个xml的相关信息,例如文件名、文档类型、子节点等等;xmlDocPtr等于xmlDoc*,它搞成这个样子总让人以为是智能指针,其实不是,要手动删除的。
xmlParseFile函数以默认方式读入一个UTF-8格式的文档,并返回文档指针。
xmlReadFile函数读入一个带有某种编码的xml文档,并返回文档指针;细节见libxml2参考手册。
xmlFreeDoc释放文档指针。
xmlDocGetRootElement函数得到根节点curNode
2.建立XML文档


代码如下:

void CreateNewXMLDemo() 
    { 
        // create xml document 
        xmlDocPtr doc = xmlNewDoc(BAD_CAST"1.0"); 
        xmlNodePtr root = xmlNewNode(NULL,BAD_CAST"root");

//set root 
        xmlDocSetRootElement(doc,root);

//add node 
        xmlNewTextChild(root, NULL, BAD_CAST "newNode1", BAD_CAST "newNode1 content"); 
        xmlNewTextChild(root, NULL, BAD_CAST "newNode2", BAD_CAST "newNode2 content"); 
        xmlNewTextChild(root, NULL, BAD_CAST "newNode3", BAD_CAST "newNode3 content");

//create node and add content

xmlNodePtr node = xmlNewNode(NULL,BAD_CAST"node2"); 
        xmlNodePtr content = xmlNewText(BAD_CAST"NODE CONTENT"); 
        xmlAddChild(root,node); 
        xmlAddChild(node,content);

// add attribute 
        xmlNewProp(node,BAD_CAST"attribute",BAD_CAST "yes");

//create son and grandson

node = xmlNewNode(NULL, BAD_CAST "son"); 
        xmlAddChild(root,node); 
        xmlNewTextChild(node, NULL, BAD_CAST "grandson", BAD_CAST "grandson content");

xmlNodePtr grandson = xmlNewNode(NULL, BAD_CAST "grandson2"); 
        xmlAddChild(node,grandson); 
        xmlAddChild(grandson, xmlNewText(BAD_CAST "This is a grandson2 node"));

//save xml

int nRel = xmlSaveFile("test3.xml",doc);

if (nRel != -1) 
        { 
            cout<<"create a xml:"<<nRel<<"bytes"<<endl; 
        }

//release

xmlFreeDoc(doc); 
    }

xmlChar是Libxml2中的字符类型,库中所有字符、字符串都是基于这个数据类型。事实上它的定义是:xmlstring.h
xmlNewDoc函数创建一个新的文档指针。
xmlNewNode可以创建一个新的节点
xmlDocSetRootElement可以将该节点设为根节点
xmlNewTextChild直接添加一个文本子节点
第二创建节点的方式是先创建新节点,然后用xmlAddChild将新节点加入上层节点。
xmlNewProp可以创建节点的属性
xmlSaveFile可以将xml存档
因为总是要在xmlChar*和char*之间进行类型转换,所以定义了一个宏BAD_CAST,其定义如下:xmlstring.h
#define BAD_CAST (xmlChar *)
3.遍历节点,修改与删除


代码如下:

xmlNodePtr head = root->children->next; 
    while(head != NULL) 
    { 
        if(head->type == XML_ELEMENT_NODE) 
        { 
            cout<<"Name:"<<head->name<<endl; 
            cout<<"Content:"<<xmlNodeGetContent(head->children)<<endl; 
            // update test05 
            if ((!xmlStrcmp(head->name, (const xmlChar *)"test05"))) 
            { 
                xmlNodeSetContent(head->children,(const xmlChar *)"orz05"); 
            }

// remove node 
            if (!xmlStrcmp(head->name, BAD_CAST "test07")) 
            { 
                xmlNodePtr tempNode; 
                tempNode = head->next; 
                xmlUnlinkNode(head); 
                xmlFreeNode(head); 
                head = tempNode; 
                continue; 
            } 
        } 
        head = head->next; 
    }

在libxml中只需要针对XML_ELEMENT_NODE型态的节点进行搜索即可
xmlNodeGetContent可以取得节点的内文
xmlNodeSetContent可以设定节点的内文
可以透过xmlStrcmp来比较是否为要找的节点,xmlNodePtr的name属性则是节点名称,children则为内文节点
xmlUnlinkNode可以删除节点


点击下载完整工程

(0)

相关推荐

  • libxml教程(图文详解)

    缘起我的CloudBox需要一个跨平台的方案来解决iOS上以及Android上的xml档案读取问题因为游戏总是需要储存一些设定值,或是过关存档之类的但又不能轻易的使用iOS内建提供的或著是Java内建提供的函数,这样整起来会很麻烦而且思考到以后增加新的平台,会有不小的困扰,最后决定就用libxmllibxml又是可以在windows环境下使用的,因此直接用visual studio也可以轻易尝试学习API如何使用环境简介操作系统: Windows XPIDE工具: Visual Studio 2

  • Mac OS系统下mysql 5.7.20安装教程图文详解

    Mac OS X 下 TAR.GZ 方式安装 MySQL 5.7 与 MySQL 5.6 相比, 5.7 版本在安装时有两处不同: 1:初始化方式改变, 从scripts/mysql_install_db --user=mysql初始化方式变成了bin/mysqld --initialize --user=mysql方式; 2: 初始密码生成改变, 5.6 的版本在 tar gz 方式初始化完成后默认 root 密码为空, 5.7 版本在初始化完成后会生成一个临时的 root 密码: 一.在浏览

  • IIS7.0 Windows Server 2008 R2 下配置证书服务器和HTTPS方式访问网站的教程图文详解

    配置环境 Windows版本:Windows Server 2008 R2 Enterprise Service Pack 1 系统类型: 64 位操作系统 了解HTTPS 为什么需要 HTTPS ? 在我们浏览网站时,多数网站的URL都是以HTTP开头,HTTP协议我们比较熟悉,信息通过明文传输; 使用HTTP协议有它的优点,它与服务器间传输数据更快速准确; 但是HTTP明显是不安全的,我们也可以注意到,当我们在使用邮件或者是在线支付时,都是使用HTTPS; HTTPS传输数据需要使用证书并对

  • mysql 5.7.17的最新安装教程图文详解

    mysql-5.7.17-winx64是现在最新版本的Mysql,这是免安装的,所以要进行些配置 下载地址:https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.17-winx64.zip 1:下载安装包,将其解压到一个文件夹下 2:复制my-default.ini,并重命名为my.ini,然后用记事本打开输入mysql的基本配置: [mysql] ; 设置mysql客户端默认字符集 default-character-set=utf8 [my

  • Mysql5.7.11绿色版安装教程图文详解

    Mysql5.7.11绿色版安装教程图文详解如下所示: 1.解压mysql-5.7.11压缩包到想要存放的磁盘文件夹中: 2.在文件夹中新建一个data文件夹和新建一个my.ini文件,并配置my.ini文件 my.ini文件内容:关键点为配置Mysql文件夹中的data目录及存储根目录 3.在我的电脑--属性--高级系统设置--环境变量--配置path变量: 变量值为: 4.使用管理员身份打开cmd.exe程序 注意:如果未使用管理员身份打开的cmd.exe,在mysql安装过程中会出现 --

  • windows系统下node.js环境配置与安装教程图文详解(详细版)

    国内目前关注最高,维护最好的一个关于nodejs的网站应该是http://www.cnodejs.org/ windows系统下简单nodejs环境配置. 第一步:下载安装文件 下载地址:官网https://nodejs.org/en/download/ 这里用的是 第二步:安装nodejs 下载完成之后,双击 node-v6.9.1-x64.msi,开始安装nodejs,默认是安装在C:\Program Files\nodejs下面 第三步:安装相关环境 打开C:\Program Files\

  • mysql-8.0.15-winx64 解压版安装教程图文详解

    1.官网下载,并解压 https://dev.mysql.com/downloads/mysql/ 2.设置环境变量 配置MYSQL_HOME为MySQL的解压路径,并在path设置;%MYSQL_HOME%\bin 3.在MySQL解压路径下,新建my.ini 配置初始化参数: [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] #设置3306端口 port = 3306 # 设置mysql的安装目录 basedir=D:

  • node.js命令行教程图文详解

    本文先介绍原生的node.js实现命令行交互,了解原生的api,然后通过commander.js和inquirer.js实现一个完整的交互命令行工具. 项目地址 process (进程) process对象是一个全局变量,它提供了当前node.js进程的信息并对其控制.因为其是一个全局变量所以无需在文件中引入. 需要用到的几个api process.argv process.cwd() process.stdin process.stdout process.stdin.resume() pro

  • mysql-8.0.16 winx64的最新安装教程图文详解

    最近刚学习数据库,首先是了解数据库是什么,数据库.数据表的基本操作,这就面临了一个问题,mysql的安装,我这里下载的是64位的,基于Windows的,以下是在我电脑上的安装过程,希望可以帮助到大家. 1.在mysql的官网上去下载,链接是 https://dev.mysql.com/downloads/mysql/ ,如图1-1,1-2所示,点击downloads,然后会弹出图1-3,点击No thanks,jast start my download.即可,当然你也可以注册一下. 图 1-1

  • python3.6环境安装+pip环境配置教程图文详解

    1.python安装可以跨平台 2.有两个版本2.7和3.6,第三方库适用2.7版,两个版本不兼容 windows安装: 第一种方法官网安装: 在官网下载安装包如图: 图下点击是默认下载32位所以我们需要历史版本下载 如图点击: 下载途中标记的: 按照图中箭头执行: 这里选中存放的路径和把配置环境变量选项勾上,如图: 安装完成 测试结果 如果出现图下的就是环境变量没有配置好: 配置环境变量: 把图中2个路径配置到环境变量中 再次输入python 如图: python就安装好了; 第二种安装方法,

随机推荐