C++中的XML配置文件编程经验

C++中的XML配置文件编程经验,第1张

来源: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。

1.       下载与安装LIBXML2和ICONV

为了方便读者,这一段原文照抄上一篇博客。

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-2.6.30.win32.zip、zlib-1.2.3.win32.zip和iconv-1.9.2.win32.zip。

在编程的时候,我们使用windows版本的libxml2、zlib和iconv,将其解压缩到指定文件夹,例如D:"libxml2-2.6.30.win32,D:"zlib-1.2.3.win32以及D:"iconv-1.9.2.win32。事实上,我们知道在windows下面使用头文件、库文件和dll是不需要安装的,它又没有使用任何需要注册的组件或者数据库,只需要告诉编译器和链接器这些资源的位置就可以了。

注意:要在path变量中加上D:"iconv-1.9.2.win32"bin;D:"zlib-1.2.3.win32"bin;D:"libxml2-2.6.30.win32"bin这三个地址,否则在执行的时候就找不到。或者使用更简单的方法,把其中的三个dll到拷贝到system32目录中。

有两种方法来编译链接基于libxml2的程序,第一种是在VC环境中设置lib和include路径,并在link设置中添加libxml2.lib和iconv.lib;第二种是用编译器选项告诉编译器cl.exe头文件的位置,并用链接器选项告诉链接器link.exe库文件的位置,同时在windows环境变量path中添加libxml2中bin文件夹的位置,以便于程序运行时可以找到dll(也可以将dll拷贝到system32目录下)。

2.       HELLO,XML CONFIG FILE

本节的源代码位于项目HelloXml中,使用的xml文件是Helloxml.xml。

在安装配置好libxml2和iconv库之后,就可以写一个简单的程序来读取XML中的数据了。该XML内容如下:

 <?xml version="1.0" encoding="GB2312" ?>

 <main>20080526</main>

使用libxml2库读取main节点包含的内容,代码如下:

 

  

 

  1. xmlChar* LoadConfigFile(const char* szConfigFilename, xmlChar* xszRel)
  2. {
  3.     xmlDocPtr doc;   //定义解析文档指针
  4.     xmlNodePtr curNodePtr; //定义结点指针
  5.     doc = xmlReadFile(szConfigFilename,"GB2312",XML_PARSE_RECOVER); //解析文件
  6.     if (doc == NULL ) 
  7.     {
  8.        fprintf(stderr,"Document not parsed successfully. "n");     
  9.        xmlFreeDoc(doc); 
  10.        exit(1);
  11.     }  
  12.     curNodePtr = xmlDocGetRootElement(doc); //确定文档根元素
  13.     /*检查确认当前文档中包含内容*/ 
  14.     if (curNodePtr == NULL)
  15.     {
  16.        fprintf(stderr,"empty document"n"); 
  17.        xmlFreeDoc(doc); 
  18.        exit(1);
  19.     }
  20.     //读取xml文档中的内容并赋值给对象属性
  21.     xszRel = xmlNodeGetContent(curNodePtr);
  22.     xmlFreeDoc(doc); 
  23.     return xszRel;
  24. }
  25. int main(int argc, char* argv[])
  26. {
  27.     xmlChar* xszContent = NULL;
  28.     xszContent = LoadConfigFile("..""Debug""HelloXml.xml",xszContent);
  29.     if (xszContent != NULL)
  30.     {
  31.        cout<<"HELLO, XML CONFIG FILE. content = "<<xszContent<<endl;
  32.        xmlFree(xszContent);
  33.     }
  34.     return 0;
  35. }

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/2086325.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-07-22
下一篇2022-07-22

发表评论

登录后才能评论

评论列表(0条)

    保存