libxml2 c库使用
##libxml2库
1、读取一个文件到内存
xmlParseFile和xmlReadFile:xmlReadFile() is a bit more powerful as it is able to take an URL instead of a local file path,同时还带参。一般用xmlReadFile
xmlReadFile、xmlParserOption:http://xmlsoft.org/html/libxml-parser.html#xmlParserOption
xmlDoc
2、获取节点
xmlNode(children、prev\last\parent)
xmlDocGetRootElement
3、新doc的组建
http://www.xmlsoft.org/examples/tree2.c
doc = xmlNewDoc(BAD_CAST "1.0");
root_node = xmlNewNode(NULL, BAD_CAST "root");
xmlDocSetRootElement(doc, root_node);
node=xmlNewChild(root_node, NULL, BAD_CAST "node2", NULL);
xmlNewProp(node, BAD_CAST "attribute", BAD_CAST "yes");
添加node及属性的方式:
xmlNewChild(root_node, NULL, BAD_CAST "node1",
BAD_CAST "content of node 1");
/*
* The same as above, but the new child node doesn't have a content
*/
xmlNewChild(root_node, NULL, BAD_CAST "node2", NULL);
/*
* xmlNewProp() creates attributes, which is "attached" to an node.
* It returns xmlAttrPtr, which isn't used here.
*/
node =
xmlNewChild(root_node, NULL, BAD_CAST "node3",
BAD_CAST "this node has attributes");
xmlNewProp(node, BAD_CAST "attribute", BAD_CAST "yes");
xmlNewProp(node, BAD_CAST "foo", BAD_CAST "bar");
/*
* Here goes another way to create nodes. xmlNewNode() and xmlNewText
* creates a node and a text node separately. They are "attached"
* by xmlAddChild()
*/
node = xmlNewNode(NULL, BAD_CAST "node4");
node1 = xmlNewText(BAD_CAST
"other way to create content (which is also a node)");
xmlAddChild(node, node1);
xmlAddChild(root_node, node);
xmlDoc属性:
xmlNode属性:name,节点名称,xmlNodeListGetString获取节点的文本内容(文本内容是节点的子节点) https://blog.csdn.net/mcgrady_tracy/article/details/46386707
xmlGetProp获取节点属性:
xmlChar* attr_value = NULL;
if(!xmlStrcmp(node->name, (const xmlChar*)"node2")) {
attr_value = xmlGetProp(node, "attribute");
printf("attribute value:%s\n",attr_value);
xmlFree(attr_value);
}
4、查找
方法1:遍历,children,prev,next,parent
方法2:xpath libxml2 supports XPath 1.0 语法定义:https://www.w3.org/TR/1999/REC-xpath-19991116/
xmlXPathContextPtr context;
xmlXPathObjectPtr result; /* 存储查询结果 */
/* 创建一个xpath上下文 */
context = xmlXPathNewContext(doc);
result = xmlXPathEvalExpression(xpath, context);
xmlXPathFreeContext(context); /* 释放上下文指针 *
if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
xmlXPathFreeObject(result); /* 如为这空就释放 */
printf("No result\n");
return NULL;
}
return result;
xpath语法符合通用xpath语法,如果值为字符串,用单引号括起:定界操作 + 定位操作
ICONV是一个专门用来进行编码转换的库,基本上支持目前所有常用的编码。它是glibc库的一个部分,常常被用于UNIX系统中。
5、删除节点
if(!xmlStrcmp(cur->name, BAD_CAST "keyword")){
xmlNodePtr tempNode;
tempNode = cur->next;
xmlUnlinkNode(cur);
xmlFreeNode(cur);
cur = tempNode;
continue;
}
注意libxml2并没有xmlDelNode或者xmlRemoveNode之类的函数。我们需要将当前节点从文档中断链(unlink),文档就不会再包含这个子节点。
这样做需要使用一个临时变量来存储断链节点的后续节点,并记得要手动删除断链节点的内存。
6、xsd验证
xmlSchemaValidateDoc
对于不复杂的数据,在程序中写入之前进行判断就ok,无需调用此函数判断。
7、附加xml工具
xmllint是一个很方便的处理及验证xml的工具,linux下只要安装libxml2就可以使用这个命令。功能有格式化、验证xsd
xml编辑器:oxygen xml editor
xmllint --noout your_test_file.xml
8、编码问题
Libxml2本身只支持把UTF-8, UTF-16和ISO-8859-1格式的外部数据转换成内部使用的UTF-8格式,以及处理完后输出成这些格式的数据。
对其他的字符编码,需要使用libiconv(当然你也可以使用其他的国际化库,例如ICU)。当前libiconv支持150多种不同的字符编码,
libiconv的实现尽量保证支持所有我们听过的编码格式。在使用libxml之前,一般是通过libiconv把数据先转换UTF-8格式。
在使用libxml处理完之后,再通过libiconv把数据输出成你要的编码格式。
9、内存释放与清理:
/*
*Free the global variables that may
*have been allocated by the parser.
*/
xmlCleanupParser();
/*
* this is to debug memory for regression tests
*/
xmlMemoryDump();
10、写入文件
xmlSaveFormatFileEnc
libxml2 c库使用相关推荐
- libxml2 libxslt库编译
libxml2官方下载地址:点击打开链接我下载的版本是2.9.3 libxslt官方下载地址:点击打开链接我下载的版本是1.1.29 一.编译libxml2-2.9.3(32位) 1. iconv库准 ...
- linux下libxml2库使用说明
linux下libxml2库使用说明_lanlicen的专栏-CSDN博客_linux xml库 第一章 什么是XML? 1.xml简介 XML(Extensible Markup Language) ...
- GDataXMLNode:xml解析库
一.GDataXMLNode说明 GDataXMLNode是Google提供的用于XML数据处理的类集.该类集对libxml2--DOM处理方式进行了封装,能对较小或中等的xml文档进行读写操作且支持 ...
- IOS常用代码总结 - 第三方库部分
1 SBJson的使用 JSON是一种数据交换语言,和XML是同样用途的.不过JSON的体积要比XML小,也就意味着在网络传输中 速度会比XML更快. 这里可以看到更多关于json的资料:http:/ ...
- IOS学习:常用第三方库(GDataXMLNode:xml解析库)
IOS学习:常用第三方库(GDataXMLNode:xml解析库) 解析 XML 通常有两种方式,DOM 和 SAX: DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过 ...
- linux命令行安装libxml,Ubuntu 14.04下libxml2的安装和使用
Ubuntu 14.04下libxml2库的安装方法: sudo apt-get install libxml2 sudo apt-get install libxml2-dev 利用以上命令安装完软 ...
- Python常用第三方库
Python常用第三方库 一. 文件读写 二.网络抓取和解析 三.数据库连接 四.数据清洗转换 五.数据计算和统计分析 六.自然语言处理和文本挖掘 七.图像和视频处理 八.音频处理 九.数据挖掘/机器 ...
- python的标识库和第三方库_Python 标准库、第三方库
Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具.这些库可用于文件读写.网络抓取和解析.数据连接.数清 ...
- libxml2的安装和使用
安装方法: sudo apt-get install libxml2 sudo apt-get install libxml2-dev 利用以上命令安装完软件包后可以利用以下命令来查看软件包的状态(确 ...
最新文章
- Android OpenGL ES(十一)绘制一个20面体 .
- 中国电子学会青少年编程能力等级测试图形化四级模拟题
- 头像裁剪上传_微信新功能:11月微信新玩法!给微信换上“皇冠头像”,还能加姓氏?...
- html怎样添加日历控件,向日历控件中添加自定义内容
- BlockChain:BlockChain周边概念详解+个人理解
- HTML5 基础知识(二)
- 线程wait()和sleep()的区别
- hosts文件不起作用
- java中thread实例_Java多线程并发执行demo代码实例
- fastjson反序列化过滤字段属性_Fastjsonlt;=1.2.47反序列化漏洞源码分析及复现
- Android性能优化:布局优化 详细解析(含include、ViewStub、merge讲解 )
- swift 关于闭包和函数
- SQL Server BI Step by Step SSIS 5 --- 通过Email发送查询结果
- 高数基础 第七章 无穷级数
- linux mtd手动烧写固件,路由器固件的几种烧写方式
- 微信客服介绍和使用指引(4.19)
- 卢卡斯Lucas定理
- 小编亲测:开售即遭“疯抢”的小度在家凭什么成了网红?
- STM32CubeMX的使用教程
- 【03】品优购电商项目:00-品优购项目代码规范
热门文章
- 在Fedora 14下安装yong输入法
- 第二十三章 类关键字 - Language
- Windows 安装 MySQL 8 zip版安装,及Windows MySQL多实例
- Linux 硬件加速 开源人脸识别引擎SeetaFace:第二步在ZedBoard上运行
- 基于富芮坤fr8016 蓝牙5.0 芯片设计的BLE HID Joystick 游戏摇杆设备
- 论文《Context Contrasted Feature and Gated Multi-scale Aggregation for Scene Segmentation》笔记
- OTA法规及备案要求
- 47件产品入选北极星建筑奖,包括北京朝阳站、望朝中心、前海腾讯数码大厦等地标亮点 | 美通社头条...
- Pandas操作02
- 电商交易规律、RFM分类