没有合适的资源?快使用搜索试试~ 我知道了~
个人总结C语言下xml使用全集-libxml.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 95 浏览量
2022-11-30
11:24:23
上传
评论
收藏 1.01MB DOCX 举报
温馨提示
试读
98页
个人总结C语言下xml使用全集_libxml.docx个人总结C语言下xml使用全集_libxml.docx
资源推荐
资源详情
资源评论
写这篇文章的原因有如下几点:1)C++标准库中没有操作 XML 的方法,用 C++操作 XML
文件必须熟悉一种函数库,LIBXML2 是其中一种很优秀的 XML 库,而且它同时支持多种编
程语言;2)LIBXML2 库的 Tutorial 写得不太好,尤其是编码转换的部分,不适用于中文编
码的转换;3)网上的大多数关于 Libxml2 的介绍仅仅是翻译了自带的资料,没有详细介绍如
何在 windows 平台下进行编程,更很少提到如何解决中文问题。
基于以上几点原因,决定写一个在Windows 平台下,使用C/C++语言,应用LibXml2 库来
进行 xml 文档操作,同时使用 ICONV 库进行中文编码转换的文档。其中还涉及了 Makefile、
XPATH 等相关内容。本文中所有的源代码在
http://www.blogjava.net/Files/wxb_nudt/xml_src.rar。
Libxml2 是一个 C 语言的 XML 程序库,可以简单方便的提供对 XML 文档的各种操作,并且
支持 XPATH 查询,以及部分的支持 XSLT 转换等功能。Libxml2 的下载地址是
http://xmlsoft.org/,完全版的库是开源的,并且带有例子程序和说明文档。最好将这个
windows 版本的的下载地址是 http://www.zlatkovic.com/libxml.en.html;这个版本
只提供了头文件、库文件和 dll,不包含源代码、例子程序和文档。在文本中,只需要下载
libxml2 库、iconv 库和 zlib 库就行了(注意,libxml2 库依赖 iconv 和 zlib 库,本文中
重点关注 libxml2 和 iconv,zlib 不介绍),我使用的版本是 libxml22.6.30.win32.zip 、
zlib1.2.3.win32.zip 和 iconv1.9.2.win32.zip 。
在编程的时候,我们使用 windows 版本的 libxml2、zlib 和 iconv,将其解压缩到指定文
D:"iconv1.9.2.win32 。事实上,我们知道在 windows 下面使用头文件、库文件和 dll
是不需要安装的,它又没有使用任何需要注册的组件或者数据库,只需要告诉编译器和链接
器这些资源的位置就可以了。
D:"iconv1.9.2.win32"binD:"zlib1.2.3.win32"binD:"libxml22.6.30.win32"bi
n 这三个地址,否则在执行的时候就找不到。或者使用更简单的方法,把其中的三个dll 到
拷贝到 system32 目录中。
1
有两种方法来编译链接基于 libxml2 的程序,第一种是在 VC 环境中设置 lib 和 include 路
径,并在 link 设置中添加 libxml2.lib 和 iconv.lib;第二种是用编译器选项告诉编译器
cl.exe 头文件的位置,并用链接器选项告诉链接器link.exe 库文件的位置,同时在
windows 环境变量 path 中添加 libxml2 中 bin 文件夹的位置,以便于程序运行时可以找
到 dll(也可以将 dll 拷贝到 system32 目录下)。显然我选择了第二种,那么编译链接一
个名为 CreateXmlFile.cpp 源文件的命令如下:
显然这样很费时,那么再不用 makefile 就显得矫情了,于是,一个典型的使用 nmake.exe
(VC 自带的 makefile 工具)的文件如下:MAKEFILE
#
# 本目录下所有源代码的 makefile,使用方法是 nmake TARGET_NAME=源代码文件
# 例如 nmake TARGET_NAME=CreateXmlFile
# Author: Wang Xuebin
#
# Flags - 编译 debug 版本
#
#指定要使用的库的路径,需要用户修改的变量一般放在 makefile 文件的最上面
LIBXML2_HOME = D:"libxml2-2.6.30.win32
ICONV_HOME = D:"iconv-1.9.2.win32
#指定编译器选项,/c 表明 cl 命令只编译不链接;/MTd 表明使用多线程 debug 库;/Zi 表明
产生完整的调试信息;
CPP_FLAGS=/c /MTd /Zi /Od /D _DEBUG
2
#指定链接的库
#指定编译路径选项,链接路径选项
INCLUDE_FLAGS= /I $(LIBXML2_HOME)"include /I $(ICONV_HOME)"include
LIB_PATH_FLAGS = /libpath:$(ICONV_HOME)"lib /libpath:$(LIBXML2_HOME)"lib
#################################################
#
# Targets 目标
#
$(TARGET_NAME).obj : $(TARGET_NAME).cpp
cl $(CPP_FLAGS) $(INCLUDE_FLAGS) $(TARGET_NAME).cpp
$(TARGET_NAME).exe : $(TARGET_NAME).obj
link $(EXE_LINK_FLAGS) $(LIB_PATH_FLAGS) $(TARGET_NAME).obj $(LIBS)
clean : $(TARGET_NAME).exe
del $(TARGET_NAME).exe
del $(TARGET_NAME).obj
del $(TARGET_NAME).ilk
del $(TARGET_NAME).pdb
3
本文不准备介绍 makefile 的写法,但后续例子程序的编译链接依葫芦画瓢都没有问题,执
行编译链接的命令如下:
执行清理的命令如下:
nmake TARGET_NAME=CreateXmlFile clean
一个函数库中可能有几百种数据类型以及几千个函数,但是记住大师的话,90%的功能都是
由 30%的内容提供的。对于 libxml2,我认为搞懂以下的数据类型和函数就足够了。
2.1 内部字符类型 xmlChar
xmlChar 是 Libxml2 中的字符类型,库中所有字符、字符串都是基于这个数据类型。事实上
它的定义是:xmlstring.h
typedef unsigned char xmlChar;
使用 unsigned char 作为内部字符格式是考虑到它能很好适应UTF-8 编码,而 UTF-8 编码
正是 libxml2 的内部编码,其它格式的编码要转换为这个编码才能在libxml2 中使用。
还经常可以看到使用 xmlChar*作为字符串类型,很多函数会返回一个动态分配内存的
xmlChar*变量,使用这样的函数时记得要手动删除内存。
如同标准 c 中的 char 类型一样,xmlChar 也有动态内存分配、字符串操作等相关函数。例
如 xmlMalloc 是动态分配内存的函数;xmlFree 是配套的释放内存函数;xmlStrcmp 是字符
串比较函数等等。
基本上 xmlChar 字符串相关函数都在 xmlstring.h 中定义;而动态内存分配函数在
xmlmemory.h 中定义。
2.3 xmlChar*与其它类型之间的转换
另外要注意,因为总是要在 xmlChar*和 char*之间进行类型转换,所以定义了一个宏
BAD_CAST,其定义如下:xmlstring.h
原则上来说,unsigned char 和 char 之间进行强制类型转换是没有问题的。
4
2.4 文档类型 xmlDoc、指针 xmlDocPtr
xmlDoc 是一个 struct,保存了一个xml 的相关信息,例如文件名、文档类型、子节点等等;
xmlDocPtr 等于 xmlDoc*,它搞成这个样子总让人以为是智能指针,其实不是,要手动删除
的。
xmlNewDoc 函数创建一个新的文档指针。
xmlParseFile 函数以默认方式读入一个 UTF-8 格式的文档,并返回文档指针。
xmlReadFile 函数读入一个带有某种编码的 xml 文档,并返回文档指针;细节见 libxml2 参
考手册。
xmlFreeDoc 释放文档指针。特别注意,当你调用 xmlFreeDoc 时,该文档所有包含的节点
内存都被释放,所以一般来说不需要手动调用xmlFreeNode 或者 xmlFreeNodeList 来释放
动态分配的节点内存,除非你把该节点从文档中移除了。一般来说,一个文档中所有节点都
应该动态分配,然后加入文档,最后调用 xmlFreeDoc 一次释放所有节点申请的动态内存,
这也是为什么我们很少看见 xmlNodeFree 的原因。
xmlSaveFile 将文档以默认方式存入一个文件。
xmlSaveFormatFileEnc 可将文档以某种编码/格式存入一个文件中。
节点应该是 xml 中最重要的元素了,xmlNode 代表了 xml 文档中的一个节点,实现为一个
struct,内容很丰富:tree.h
void
xmlElementType type; /* type number, must be second ! */
const xmlChar *name; /* the name of the node, or the entity */
*_private;/* application data */
struct _xmlNode *parent;/* child->parent link */
5
剩余97页未读,继续阅读
资源评论
G11176593
- 粉丝: 6646
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 51单片机内部eeprom驱动代码.zip
- 智器阅读(最好用的安卓PDF阅读工具 修复Android6.0以上不能访问存储卡)
- 携程旅行parmas参数testab逆向
- 2022-1999年地区市场公平竞争程度
- 小米AX1800刷集客AP
- pdal2.7.1点云布料模拟滤波
- 2011-2022年全国各区县每日天气气温风向风力数据
- PDF合并器.exe\发票合并打印\PDF文件合并\PyPDF2包\PyQt5库\PdfReader模块\PdfWriter模块
- 尚硅谷JavaWeb项目改造:SpringBoot+MybatisPlus重构微头条
- c&c++课程设计KTV歌曲系统,学生档案管理系统,个人收支系统,职工管理系统等
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功