
来源:http://www.blogjava.net/wxb_nudt/archive/2008/05/27/203317.html
C++中并没有 *** 作XML文件的标准库,因此大家需要使用各自熟悉的XML库来解决XML文件的读取与写入。XML的一个重要用途是作为程序的配置文件,存储程序运行相关的各种数据。本文总结了使用libxml2库来对XML配置文件进行编程的一些经验。最后提供了一个封装好的类CXMLConfig,并详细说明了该类的功能、使用方法和注意事项。
阅读本文所需的技术背景:
l C/C++简单语法;
l XML技术,XPATH技术;
l C++编译器知识;
本文的内容包括:
l 下载与安装LIBXML2和ICONV;
l 第一个例子程序的编写、编译链接和运行;
l 使用XPATH读出多个配置项的值;
l XML的配置文件类CXMLConfig;
l 将配置项写入XML文件;
l CXMLConfig类使用小结;
阅读本文之前最好先读我的上一篇博客C++的XML编程经验――LIBXML2库使用指南,那一篇专门介绍libxml2库的使用方法。本文将不会再详细介绍libxml2的使用,而是集中精力介绍如何存取XML中的数据。
本文的源代码是一个VC6的工程,里面包含三个子工程。地址在http://www.blogjava.net/Files/wxb_nudt/XMLConfigFile.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不介绍),我使用的版本是libxml2-
在编程的时候,我们使用windows版本的libxml2、zlib和iconv,将其解压缩到指定文件夹,例如D:"libxml2-
注意:要在path变量中加上D:"iconv-
有两种方法来编译链接基于libxml2的程序,第一种是在VC环境中设置lib和include路径,并在link设置中添加libxml2.lib和iconv.lib;第二种是用编译器选项告诉编译器cl.exe头文件的位置,并用链接器选项告诉链接器link.exe库文件的位置,同时在windows环境变量path中添加libxml2中bin文件夹的位置,以便于程序运行时可以找到dll(也可以将dll拷贝到system32目录下)。
本节的源代码位于项目HelloXml中,使用的xml文件是Helloxml.xml。
在安装配置好libxml2和iconv库之后,就可以写一个简单的程序来读取XML中的数据了。该XML内容如下:
<?xml version="1.0" encoding="GB2312" ?>
<main>20080526</main>
使用libxml2库读取main节点包含的内容,代码如下:
- xmlChar* LoadConfigFile(const char* szConfigFilename, xmlChar* xszRel)
- {
- xmlDocPtr doc; //定义解析文档指针
- xmlNodePtr curNodePtr; //定义结点指针
- doc = xmlReadFile(szConfigFilename,"GB2312",XML_PARSE_RECOVER); //解析文件
- if (doc == NULL )
- {
- fprintf(stderr,"Document not parsed successfully. "n");
- xmlFreeDoc(doc);
- exit(1);
- }
- curNodePtr = xmlDocGetRootElement(doc); //确定文档根元素
- /*检查确认当前文档中包含内容*/
- if (curNodePtr == NULL)
- {
- fprintf(stderr,"empty document"n");
- xmlFreeDoc(doc);
- exit(1);
- }
- //读取xml文档中的内容并赋值给对象属性
- xszRel = xmlNodeGetContent(curNodePtr);
- xmlFreeDoc(doc);
- return xszRel;
- }
- int main(int argc, char* argv[])
- {
- xmlChar* xszContent = NULL;
- xszContent = LoadConfigFile("..""Debug""HelloXml.xml",xszContent);
- if (xszContent != NULL)
- {
- cout<<"HELLO, XML CONFIG FILE. content = "<<xszContent<<endl;
- xmlFree(xszContent);
- }
- return 0;
- }
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)