Libxml2 学习
1、概要
libxml 是一个实现操作XML数据功能的开源C语言库。
2、windows下使用libxml
配置VS 项目中添加头文件和 三个的都文件都需要
3、libxml使用
3.1 libxml 生成xml文件
主要通过函数 xmlNewDoc xmlNewNode xmlDocSetRootElement xmlNewTextChild xmlSaveFormatFileEnc 来实现
如下代码:
static int Test_New(char* szFile)
{
xmlDocPtr doc = NULL; //
xmlNodePtr rootNode = NULL;
xmlNodePtr node = NULL;
xmlNodePtr node1 = NULL;
doc = xmlNewDoc(BAD_CAST "1.0");
rootNode = xmlNewNode(NULL, BAD_CAST "root");
xmlDocSetRootElement(doc, rootNode);
node = xmlNewTextChild(rootNode, NULL, BAD_CAST "student", NULL);
xmlNewTextChild(node, NULL, BAD_CAST "name", BAD_CAST "zhangsan");
xmlNewTextChild(node, NULL, BAD_CAST "age", BAD_CAST "25");
xmlNewTextChild(node, NULL, BAD_CAST "sex", BAD_CAST "labc");
xmlNewChild(rootNode, NULL, BAD_CAST "node1", BAD_CAST "node1_test&");
xmlNewTextChild(rootNode, NULL, BAD_CAST "node2", BAD_CAST "node2_test&");
node = xmlNewTextChild(rootNode, NULL, BAD_CAST "node3", BAD_CAST "node3test");
xmlNewProp(node, BAD_CAST "color", BAD_CAST "0A");
xmlNewProp(node, BAD_CAST "attr", BAD_CAST "123");
node = xmlNewNode(NULL, BAD_CAST "node4");
node1 = xmlNewText(BAD_CAST "node4T<");
xmlAddChild(rootNode, node);
xmlAddChild(node, node1);
xmlSaveFormatFileEnc(szFile, doc, "UTF-8", 1);
xmlFreeDoc(doc);
return 0;
}
结果:
需要几点注意的地方:
(1)这里一定注意 xmlNewDoc 中固定为1.0 千万不要写其他的,否则会出错。之前写成了V1.0 被折腾了半天。
(2)xmlNewTextChild xmlNewChild 都可以创建子节点,但是他们还是有区别的,主要区别在于如果content中包含了& < > 等符号时,使用xmlNewChild 会出错,而 xmlNewTextChild 不会出错,这些保留符号会被自动转义,所以推荐使用 xmlNewTextChild
(3)一共提供了3中增加子节点的方法,注意 xmlNewText 也会转义特殊字符。
3.2 libxml 遍历xml文件的node
static int print_child(xmlNodePtr node)
{
if (node == NULL)
{
return 1;
}
if (node->type == XML_ELEMENT_NODE)
{
printf("<%s>\n", node->name);
}
for (node = node->children; node != NULL; node = node->next)
{
print_child(node);
}
return 0;
}
static int Test_AnalysisFile(char* szFile)
{
xmlDocPtr doc = NULL; //文件指针
xmlNodePtr root = NULL;
doc = xmlReadFile(szFile, "UTF-8", XML_PARSE_NOBLANKS);
if (doc == NULL)
{
printf("xmlReadFile error %s\n", xmlGetLastError()->message);
return 1;
}
root = xmlDocGetRootElement(doc);
if (root == NULL)
{
xmlFreeDoc(doc);
return 0;
}
print_child(root);
xmlFreeDoc(doc);
return 0;
}
通过 xmlReadFile 函数来实现解析xml文件。
注意,这里node->children 也可以用宏定义 node->xmlChildrenNode
3.3 转换xml Node为字符串
static int Test_ToString(char* szFile)
{
xmlDocPtr doc = NULL; //文件指针
xmlNodePtr root = NULL;
xmlBufferPtr nodeBuffer;
char szBuf[1024] = { 0 };
doc = xmlReadFile(szFile, "UTF-8", XML_PARSE_NOBLANKS);
if (doc == NULL)
{
printf("xmlReadFile error %s\n", xmlGetLastError()->message);
return 1;
}
root = xmlDocGetRootElement(doc);
if (root == NULL)
{
xmlFreeDoc(doc);
return 0;
}
nodeBuffer = xmlBufferCreate();
xmlNodeDump(nodeBuffer, doc, root, 0, 1);
snprintf(szBuf, sizeof(szBuf), (char*)nodeBuffer->content);
xmlBufferFree(nodeBuffer);
xmlFreeDoc(doc);
printf("%s\n", szBuf);
return 0;
}
这里,通过xmlNodeDump来实现转换为字符串,结果如下
注意这里 xmlNodeDump(nodeBuffer, doc, root, 0, 1); 函数最后一个参数 如果为0的话则会去掉空白符如下
- iOS 阶段学习第23天笔记(XML数据格式介绍)
iOS学习(OC语言)知识点整理 一.XML数据格式介绍 1)概念:xml是extensible markup language扩展的标记语言,一般用来表示.传输和存储数据 2)xml与json目前使 ...
- Android源码-学习随笔
在线代码网站1:http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/ 书籍: ...
- IOS学习笔记25—HTTP操作之ASIHTTPRequest
IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...
- 值得学习的C语言开源项目
值得学习的C语言开源项目 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工 ...
- 关于学习是UIWebView的一些思考
前几天因为数据中加载有html语言的数据,关于html语言和UIWebView,有一些纠结,经过几天的研究,也有了一些自己的简单的见解. 我有两个页面需要加载html语言(注意,这里 ...
- XML格式以及相关libxml库学习
本文参考 XML文件格式语法以及DTD,摘除其中自己认为必要的知识点,在此记录如下. 先给出一个xml的实例文件, <?xml version="1.0" encoding= ...
- IOS学习:常用第三方库(GDataXMLNode:xml解析库)
IOS学习:常用第三方库(GDataXMLNode:xml解析库) 解析 XML 通常有两种方式,DOM 和 SAX: DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过 ...
- 值得学习的C/C++开源框架(转)
值得学习的C语言开源项目 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的 ...
- #0 scrapy爬虫学习中遇到的坑记录
python 基础学习中对于scrapy的使用遇到了一些问题. 首先进行的是对Amazon.cn的检索结果页进行爬取,很顺利,无碍. 下一个目标是对baidu的搜索结果进行爬取 1,反爬虫 1.1 我 ...
随机推荐
- php代码审计2全局变量和超全局变量
全局变量:就是在函数外面定义的变量,不能在函数中直接使用,因为它的作用域不会到函数内部,所以在函数内部使用的时候尝尝看到类似global $a; 超全局变量:在所有脚本都有效,所以,在函数可以直接使用 ...
- redis源码分析(3)sds
sds是redis中用来处理字符串的数据结构.sds的定义在sds.h中: typedef char *sds; 简洁明了!简明扼要!(X,玩我呢是吧!这特么不就是c中的字符串么?!).像redis这 ...
- Java create azure web app
create a certificate <java-install-dir>/bin/ keytool -genkey -alias <keystore-id> -keyst ...
- Flink生态与未来
本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKhaz ...
- Python开发MapReduce系列(一)WordCount Demo
原创,转发请注明出处. MapReduce是hadoop这只大象的核心,Hadoop 中,数据处理核心就是 MapReduce 程序设计模型.一个Map/Reduce 作业(job) 通常会把输入的数 ...
- 数据结构54:平衡二叉树(AVL树)
上一节介绍如何使用二叉排序树实现动态查找表,本节介绍另外一种实现方式——平衡二叉树. 平衡二叉树,又称为 AVL 树.实际上就是遵循以下两个特点的二叉树: 每棵子树中的左子树和右子树的深度差不能超过 ...
- Chrome浏览器如何完美实现滚动截图技巧
一.前言 我们平时在浏览网页时,想把碰到好的网页内容或者文章截屏保存,但是网页的长度常常会超出屏幕高度,一般的截屏功能只能截取显示在屏幕上的内容,那我们该如何方便快捷截取全部内容?今天就分享一个如何利 ...
- 014 Android BottomNavigationView 底部导航组件使用
1.导入BottomNavigationView组件(点击下载按钮,安装组件) 2.新建菜单 (1)app--->src-->main--->res ,选中res目录右击new--- ...
- DropDownList绑定及修改
DropDownList绑定及修改 http://www.cnblogs.com/hulang/archive/2010/12/29/1920662.html ? 1 2 3 4 5 6 7 8 ...
- 蓝桥-青蛙跳杯子(bfs)
问题描述 X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色. X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去. 如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙 ...