最近,项目组让搞一个读取xml配置文件的数据库连接信息的功能。

  一开始准备使用tinyxml,或者rapidxml。没注意delta3d的读取xml信息的类。

  后来发现,delta3d中读取xml的类,是对xecres的一些二次封装,专门读delta3d的地图,里面含有角色代理之类的。

对于读取自己的数据库连接信息不太方便。就准备用delta3d自带的xecres开源库,自己写一个。

一开始以为xecres的资料应该很多,后来发现都不太完整,结合网上的一些实例。搞了二天,终于出了一版读取自己xml的一个类。

写下来,以便记忆。如后来有改善,就不断更新。

代码如下:头文件:

#include <xercesc/dom/DOMDocumentType.hpp>#include <xercesc/dom/DOMElement.hpp>#include <xercesc/dom/DOMImplementation.hpp>#include <xercesc/dom/DOMImplementationLS.hpp>#include <xercesc/dom/DOMNodeIterator.hpp>#include <xercesc/dom/DOMNodeList.hpp>#include <xercesc/dom/DOMNamedNodeMap.hpp>#include <xercesc/dom/DOMText.hpp>#include <xercesc/dom/DOMAttr.hpp>#include <xercesc/dom/DOMTreeWalker.hpp>#include <xercesc/parsers/XercesDOMParser.hpp>#include <xercesc/util/XMLUni.hpp>#include <xercesc/framework/XMLFormatter.hpp>#include <xercesc/util/XMLString.hpp>#include <stdlib.h>#include <string>#include <vector>#include <map>#include <stdexcept>using namespace std;using namespace xercesc;class ReadXml{public:    ReadXml();    ~ReadXml();void xmlParser(string&) throw(std::runtime_error);int loopXMLElement(DOMNode *node);

private:    XercesDOMParser *m_DOMXmlParser;    typedef map<string ,string> DATA_INFORMATION;    DATA_INFORMATION dataMap;

};

实现文件:

#include <string>#include <iostream>#include <sstream>#include "ReadXML.h"

ReadXml::ReadXml(){try    {        XMLPlatformUtils::Initialize();//初始化类库

    }catch (xercesc::XMLException& excp)    {char* msg = XMLString::transcode(excp.getMessage());        printf("XML tookit initialization error: %S\n",msg);        XMLString::release(&msg);    }    m_DOMXmlParser = new XercesDOMParser;

}ReadXml::~ReadXml(){try    {        XMLPlatformUtils::Terminate();    }catch(XMLException& excp)    {char* msg = XMLString::transcode(excp.getMessage());        printf("XML toolkit terminate error: %s\n", msg);        XMLString::release(&msg);    } }

void ReadXml::xmlParser(string& xmlFile) throw(std::runtime_error){

    m_DOMXmlParser->setValidationScheme(XercesDOMParser::Val_Auto);//采用Schemal自动验证

/*设置Parser是否处理xml文档中的名域,如果为true,则Parser增强名域定义的约束和规则。*/    m_DOMXmlParser->setDoNamespaces( false );

/*设置Parser处理xml文档中的schema,false就是不处理 */    m_DOMXmlParser->setDoSchema( false );/**/    m_DOMXmlParser->setLoadExternalDTD( false );try    {/*Parser解析器调用parse方法解析XML,安装解析器设置的各种参数,执行Schemal验证,将XML读取到内存,并成为一个DOM树形结构*/        m_DOMXmlParser->parse(xmlFile.c_str()) ;

//取得DOM数据        DOMDocument* xmlDoc = m_DOMXmlParser->getDocument();//取得根结点        DOMElement *pRoot = xmlDoc->getDocumentElement();

if (!pRoot )        {throw(std::runtime_error( "empty XML document" ));        }//创建一个 walker to 遍历结点//DOMNodeFilter::SHOW_ELEMENT显示元素结点,SHOW_TEXT显示文本结点        DOMTreeWalker* walker = xmlDoc->createTreeWalker(pRoot,DOMNodeFilter::SHOW_ELEMENT,0,true);        std::cout<<"TreeWalker:\n";

for (DOMNode *current = walker->nextNode();current!=0;current=walker->nextNode())        {

            loopXMLElement(current);        }

        std::cout<<std::endl;//创建一个迭代器去遍历结点        DOMNodeIterator* iterator = xmlDoc->createNodeIterator(pRoot,             DOMNodeFilter::SHOW_ELEMENT,  NULL, true);        std::cout<< "iterator遍历开始:\n";

for ( DOMNode * current = iterator->nextNode();            current != 0; current = iterator->nextNode() )        {string strName  = XMLString::transcode(current->getNodeName()); string strValue = XMLString::transcode((current->getFirstChild())->getNodeValue());            std::cout <<strName<<strValue<<endl;

        }

        std::cout<< std::endl;     }catch( xercesc::XMLException& excp )    {char* msg = xercesc::XMLString::transcode( excp.getMessage() );        ostringstream errBuf;        errBuf << "Error parsing file: " << msg << flush;        XMLString::release( &msg );    } 

}/**@brief 遍历DOM节点,采用递归算法,遍历该节点下的所有元素极其属性值(该方法主要是用于上面的parse方法的调用)

* @param 需要遍历的节点

* @return  0:表示遍历成功,1:表示失败

*/int ReadXml::loopXMLElement(DOMNode *node){//DOMNode * child;

if (node->getNodeType() == DOMNode::ELEMENT_NODE) {/*XMLString.transcode() 这个方法有多个重载,既可以把 XMLCh * 格式的数据转换成            char *的数据,也可以把 char * 的数据转换成 XMLCh *, 我们也可以利用这个函数来            初始化 XMLCh格式类型的数组,比如 XMLCh temp[100];            XMLString.transcode(“LS”,temp,99);            用“ LS ”初始化 temp 这个数组的内容。*/    //char * nodeName = XMLString::transcode(node->getNodeName());//获取该节点的名称,这里不需要,注释掉//std::string strName(nodeName);

//获取改节点的属性值,作为map中的value        char * nodeValue = XMLString::transcode((node->getFirstChild())->getNodeValue());        std::string strValue(nodeValue);

//如果该节点下有属性,则遍历其属性

if (node->hasAttributes())        {

            DOMNamedNodeMap *pAttributes = node->getAttributes();

const XMLSize_t nSize = pAttributes->getLength();

//遍历该节点下的所有属性

for (XMLSize_t i = 0; i < nSize; ++i)             {

                DOMAttr *pAttributeNode = (DOMAttr*) pAttributes->item(i);/*    属性的名字不需要                char *name = XMLString::transcode(pAttributeNode->getName());                std::string name_str = name;*/

//获取属性值,作为map中的key                char *attrValue = XMLString::transcode(pAttributeNode->getValue());string  attr_str = attrValue;

//将属性值存放到返回的对象中,此处自己构造对象填值                std::cout<<attrValue<<"="<<strValue<<std::endl;/*本map就是用来存储用户登录数据库信息形式如下:            hostname":192.168.131.202*/                dataMap[attrValue]=strValue;

                XMLString::release(&attrValue);//释放资源

            }

        }

        XMLString::release(&nodeValue);

    }

return 0;}int main(int argc ,char* argv[]){        ReadXml *xx = new ReadXml();string ss = "dbconfig.xml";//添加自己的配置文件。    xx->xmlParser(ss);return 0;}

以上代码,放在VS中,可以直接运行。如有改善,请跟评论,谢谢。

我的配置文件是如下格式:

<dbconfig><property name="hostname">192.168.131.202</property><property name="databasename">*****</property><property name="username">****</property><property name="password">****</property><property name="port">***</property></dbconfig>

转载于:https://www.cnblogs.com/kanego/archive/2011/11/15/2249817.html

delta3d中,读取自己的xml配置文件。相关推荐

  1. spring中的注解和xml配置文件中配置对应总结

    spring中的注解和xml配置文件中配置对应 需要导入的jar spring-context spring-context-support spring-test commons-logging b ...

  2. idea中生成spring的 xml配置文件_【132期】面试再被问到Spring容器IOC初始化过程,就拿这篇文章砸他~...

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅 阶段汇总集 ...

  3. intellij idea中设置mybatis的xml配置文件的背景色

    点击这里查看 <intellij idea使用教程汇总篇> 场景:在idea中打开mybatis的配置文件××Mapper.xml,打开后黄压压的一大片,背景色是真的不太友好,如下图所示: ...

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

    来源:http://www.blogjava.net/wxb_nudt/archive/2008/05/27/203317.html<?xml:namespace prefix = o ns = ...

  5. spring核心配置文件引入外部properties文件和另外的xml配置文件

    spring核心配置文件引入外部properties文件和另外的xml配置文件 为什么要引入外部文件 我们使用jdbc的时候,会创建一个jdbc.properties配置文件,如果我需要在spring ...

  6. web.xml 配置文件 超详细说明!!!

    一.web.xml是什么? 首先 web.xml 是java web 项目的一个重要的配置文件,但是web.xml文件并不是Java web工程必须的. web.xml文件是用来配置:欢迎页.serv ...

  7. 《转》 在C++中使用TinyXML2解析xml

    读取和设置xml配置文件是最经常使用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,由于它的API接口和Java的十分类似.面向对象性非常好.       TinyX ...

  8. FastDDS的xml配置文件配置项,查询用

    xml配置说明 见右侧目录或直接在网页搜索 创建一个xml文件 一个xml文件可以包含多个xml配置,这些xml配置在元素中定义,整个xml的结构包括根元素配置和独立元素配置,大致结构如下: < ...

  9. IDEA 创建 Spring 的 XML 配置文件

    方法一: 首先右键项目 --> Add Framework Support 然后根据自己的需要勾上 Spring 预定义配置,注意要勾上"Create empty spring-con ...

最新文章

  1. NFV技术本质是强调网络功能的软硬件同化能力,实现网络价值由硬件向软件的前移
  2. python exec
  3. mysql联合查询数量不一致_Mybatis关联查询,查询出的记录数量与数据库直接查询不一致,如何解决?...
  4. pyspark import 可以通过 --py-files
  5. Drawer的使用(一):xml文件中使用
  6. C++友元函数访问私有成员
  7. MySQL HINT:Straight_JOIN
  8. 机器学习入门:机器学习概论
  9. 工作中的小技巧(一)
  10. 飞畅科技-工业交换机防雷知识总结
  11. gerrit Cannot Merge
  12. CentOS6.4 xen4.2 虚拟机 桥接网络设置
  13. SMT贴片加工回流焊接出现的问题和解决对策
  14. comms-logging 输出级别设置
  15. uniapp实现图片压缩:
  16. airplus.exe
  17. POJ 1417 True Liars 带权并查集 + 背包
  18. win7下批处理bat文件:切换网络设置
  19. Adobe Lightroom Classic 入门教程(七)修改照片 --- 暗角颗粒与相机配置校正
  20. 职场人理财之指数基金篇

热门文章

  1. sudo apt-get install lsb-core
  2. php拆分excel,PHP_PHPExcel合并与拆分单元格的方法,本文实例讲述了PHPExcel合并与 - phpStudy...
  3. 使用IntelliJ IDEA配置Erlang开发环境
  4. 深入浅出聊Unity3D优化:从Draw Calls到GC
  5. StarlingMVC:为Starling量身打造的MVC框架
  6. C# 图片处理之:彩色图片转为黑白图
  7. php会不会被人工智能取代,人工智能真的会取代前端开发吗?
  8. android顶部居中,如何将drawableLeft对齐到顶部,而不是在android TextView中居中?
  9. 前端路由跳转丢失端口号_Laravel框架-路由的基本概念及实例分析
  10. Java异常统一处理