delta3d中,读取自己的xml配置文件。
最近,项目组让搞一个读取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配置文件。相关推荐
- spring中的注解和xml配置文件中配置对应总结
spring中的注解和xml配置文件中配置对应 需要导入的jar spring-context spring-context-support spring-test commons-logging b ...
- idea中生成spring的 xml配置文件_【132期】面试再被问到Spring容器IOC初始化过程,就拿这篇文章砸他~...
点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅 阶段汇总集 ...
- intellij idea中设置mybatis的xml配置文件的背景色
点击这里查看 <intellij idea使用教程汇总篇> 场景:在idea中打开mybatis的配置文件××Mapper.xml,打开后黄压压的一大片,背景色是真的不太友好,如下图所示: ...
- C++中的XML配置文件编程经验
来源:http://www.blogjava.net/wxb_nudt/archive/2008/05/27/203317.html<?xml:namespace prefix = o ns = ...
- spring核心配置文件引入外部properties文件和另外的xml配置文件
spring核心配置文件引入外部properties文件和另外的xml配置文件 为什么要引入外部文件 我们使用jdbc的时候,会创建一个jdbc.properties配置文件,如果我需要在spring ...
- web.xml 配置文件 超详细说明!!!
一.web.xml是什么? 首先 web.xml 是java web 项目的一个重要的配置文件,但是web.xml文件并不是Java web工程必须的. web.xml文件是用来配置:欢迎页.serv ...
- 《转》 在C++中使用TinyXML2解析xml
读取和设置xml配置文件是最经常使用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,由于它的API接口和Java的十分类似.面向对象性非常好. TinyX ...
- FastDDS的xml配置文件配置项,查询用
xml配置说明 见右侧目录或直接在网页搜索 创建一个xml文件 一个xml文件可以包含多个xml配置,这些xml配置在元素中定义,整个xml的结构包括根元素配置和独立元素配置,大致结构如下: < ...
- IDEA 创建 Spring 的 XML 配置文件
方法一: 首先右键项目 --> Add Framework Support 然后根据自己的需要勾上 Spring 预定义配置,注意要勾上"Create empty spring-con ...
最新文章
- NFV技术本质是强调网络功能的软硬件同化能力,实现网络价值由硬件向软件的前移
- python exec
- mysql联合查询数量不一致_Mybatis关联查询,查询出的记录数量与数据库直接查询不一致,如何解决?...
- pyspark import 可以通过 --py-files
- Drawer的使用(一):xml文件中使用
- C++友元函数访问私有成员
- MySQL HINT:Straight_JOIN
- 机器学习入门:机器学习概论
- 工作中的小技巧(一)
- 飞畅科技-工业交换机防雷知识总结
- gerrit Cannot Merge
- CentOS6.4 xen4.2 虚拟机 桥接网络设置
- SMT贴片加工回流焊接出现的问题和解决对策
- comms-logging 输出级别设置
- uniapp实现图片压缩:
- airplus.exe
- POJ 1417 True Liars 带权并查集 + 背包
- win7下批处理bat文件:切换网络设置
- Adobe Lightroom Classic 入门教程(七)修改照片 --- 暗角颗粒与相机配置校正
- 职场人理财之指数基金篇
热门文章
- sudo apt-get install lsb-core
- php拆分excel,PHP_PHPExcel合并与拆分单元格的方法,本文实例讲述了PHPExcel合并与 - phpStudy...
- 使用IntelliJ IDEA配置Erlang开发环境
- 深入浅出聊Unity3D优化:从Draw Calls到GC
- StarlingMVC:为Starling量身打造的MVC框架
- C# 图片处理之:彩色图片转为黑白图
- php会不会被人工智能取代,人工智能真的会取代前端开发吗?
- android顶部居中,如何将drawableLeft对齐到顶部,而不是在android TextView中居中?
- 前端路由跳转丢失端口号_Laravel框架-路由的基本概念及实例分析
- Java异常统一处理