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可以删除节点
点击下载完整工程
上一篇:C++中用两个标准容器stack,实现一个队列的方法详解
栏 目:C语言
本文标题:libxml教程(图文详解)
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/4385.html
您可能感兴趣的文章
- 01-10基于SVN源码服务器搭建(详细教程分析)
- 01-10C++操作SQLite简明教程
- 01-10C++中基类和派生类之间的转换实例教程
- 01-10C++类中的static和const用法实例教程
- 01-10C语言循环结构与时间函数用法实例教程
- 01-10MFC控件之CListCtrl的应用实例教程
- 01-10C语言变量类型与输出控制用法实例教程
- 01-10VC++中内存对齐实例教程
- 01-10C语言入门之指针用法教程
- 01-10MFC之ComboBox控件用法实例教程
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10C#中split用法实例总结
- 04-02jquery与jsp,用jquery
- 01-11ajax实现页面的局部加载
- 01-10SublimeText编译C开发环境设置
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10delphi制作wav文件的方法
- 08-05织梦dedecms什么时候用栏目交叉功能?