TiXmlHandle的使用-简化tinyxml的代码
借鉴于:http://www.cppblog.com/elva/archive/2008/04/24/47907.html
例如:
<?xml version="1.0" standalone=no>
<!– Our to do list data –>
<ToDo>
<Item priority="1"> Go to the <bold>Toy store!</bold></Item>
<Item priority="2"> Do bills</Item>
</ToDo>
想要健壮地读取一个XML文档,检查方法调用后的返回值是否为null是很重要的。一种安全的检错实现可能会产生像这样的代码:
TiXmlElement* root = document.FirstChildElement( "Document" );
if ( root )
{
TiXmlElement* element = root->FirstChildElement( "Element" );
if ( element )
{
TiXmlElement* child = element->FirstChildElement( "Child" );
if ( child )
{
TiXmlElement* child2 = child->NextSiblingElement( "Child" );
if ( child2 )
{
// Finally do something useful.
用句柄(TiXmlHandle)的话就不会这么冗长了,使用TiXmlHandle类,前面的代码就会变成这样:
TiXmlHandle docHandle( &document );
TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", ).ToElement();
if ( child2 )
{
// do something useful
一、读取XML,设置节点文本
如下XML片段:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<ZXML>
<ZAPP>
<VBS_RUNTIME_PARAMS>
<BROADCAST_VERSION info="版本">8</BROADCAST_VERSION>
<Broadcast>
<FileCount info="资源文件个数">69</FileCount>
<SOURCE_1>
<ID info="图片编号">1</ID>
<Version info="图片版本">1</Version>
<Path info="图片路径">/mnt/share/1.bmp</Path>
<FileMode info="文件处理模式">0</FileMode>
</SOURCE_1>
<SOURCE_2>
<Path info="图片路径">/mnt/share/2.bmp</Path>
<ID info="图片编号">2</ID>
<Version info="图片版本">1</Version>
<FileMode info="文件处理模式">0</FileMode>
</SOURCE_2>
.
</Broadcast>
</VBS_RUNTIME_PARAMS>
</ZAPP>
</ZXML>
要设置BROADCAST_VERSION节点的值 8为其他值,可参考如下代码(将值加1):
用ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis )方法替换
TiXmlDocument doc("zapp.conf");
doc.LoadFile();
TiXmlHandle docHandle( &doc );
TiXmlElement* Broadcast_ver = docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("VBS_RUNTIME_PARAMS").FirstChildElement("BROADCAST_VERSION").ToElement();
TiXmlNode * oldnode = Broadcast_ver->FirstChild();
const char *ver = Broadcast_ver->GetText();
int oldVer = atoi(ver);
CString newVer;
newVer.Format("%d",oldVer+);
TiXmlText newText(newVer);
Broadcast_ver->ReplaceChild(oldnode,newText);
AfxMessageBox(Broadcast_ver->GetText());//输出值
doc.SaveFile();
二,删除节点,属性值
RemoveChild( TiXmlNode* removeThis )方法删除父节点的子节点,
RemoveAttribute( const char * name )方法删除属性值.
例如删除BROADCAST_VERSION节点
TiXmlHandle docHandle( &doc );
TiXmlElement* Broadcast_ver = docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("VBS_RUNTIME_PARAMS").ToElement(); TiXmlNode * node = Broadcast_ver->FirstChild("BROADCAST_VERSION"); Broadcast_ver->RemoveChild(node);
也可以删除整个SOURCE_1节点:
TiXmlHandle docHandle( &doc );
TiXmlElement* Broadcast = docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("VBS_RUNTIME_PARAMS").FirstChild("Broadcast").ToElement(); TiXmlNode * node = Broadcast->FirstChild("SOURCE_1"); Broadcast->RemoveChild(node);
删除BROADCAST_VERSION的info属性:
TiXmlHandle docHandle( &doc );
TiXmlElement* Broadcast_ver = docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("VBS_RUNTIME_PARAMS").FirstChildElement("BROADCAST_VERSION").ToElement(); Broadcast_ver->RemoveAttribute("info"); //删除info
可以借助NextSiblingElement()方法实现递归删除.
三,添加节点,属性值
例如在SOURCE_3下添加BROADCAST_PID节点:
TiXmlHandle docHandle( &doc );
TiXmlElement* Broadcast = docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("VBS_RUNTIME_PARAMS").FirstChild("Broadcast").ToElement();
TiXmlElement* Broadcast_Pid = new TiXmlElement("BROADCAST_PID");
TiXmlText *text =new TiXmlText("");
Broadcast_Pid->SetAttribute("info","the pid");
Broadcast_Pid->LinkEndChild(text);
Broadcast->LinkEndChild(Broadcast_Pid);
将在SOURCE_3后添加新的节点:
<BROADCAST_PID info="the pid">7215</BROADCAST_PID>
四,最后说一下中文乱码的问题
乱码是由于GB2312与UTF8之间转换不当造成的,tinyxml在处理UTF8本身没有问题,当你打开一个UTF8的文档,可以在加载的时候指定UTF8的方式,或者文档声明处指明的编码格式,tinyxml会按照相应的编码格式加载,但很多时候当我们输出或写入中文字段时会出现乱码,无论在内存,还是打印出来的内容.这是因为我们的软件通常是GB2312编码,而读取或写入的内容是UTF8,自然就会出错.可以借助网上的两个函数来实现转换(原作者不详):
void ConvertUtf8ToGBK(CString& strUtf8)
{
int len=MultiByteToWideChar(CP_UTF8, , (LPCTSTR)strUtf8, -, NULL,);
unsigned short * wszGBK = new unsigned short[len+];
memset(wszGBK, , len * + );
MultiByteToWideChar(CP_UTF8, , (LPCTSTR)strUtf8, -, wszGBK, len); len = WideCharToMultiByte(CP_ACP, , wszGBK, -, NULL, , NULL, NULL);
char *szGBK=new char[len + ];
memset(szGBK, , len + );
WideCharToMultiByte (CP_ACP, , wszGBK, -, szGBK, len, NULL,NULL); strUtf8 = szGBK;
delete[] szGBK;
delete[] wszGBK;
} void ConvertGBKToUtf8(CString& strGBK)
{
int len=MultiByteToWideChar(CP_ACP, , (LPCTSTR)strGBK, -, NULL,);
unsigned short * wszUtf8 = new unsigned short[len+];
memset(wszUtf8, , len * + );
MultiByteToWideChar(CP_ACP, , (LPCTSTR)strGBK, -, wszUtf8, len); len = WideCharToMultiByte(CP_UTF8, , wszUtf8, -, NULL, , NULL, NULL);
char *szUtf8=new char[len + ];
memset(szUtf8, , len + );
WideCharToMultiByte (CP_UTF8, , wszUtf8, -, szUtf8, len, NULL,NULL); strGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}
当然,你也可以用MultiByteToWideChar,WideCharToMultiByte函数自己实现转换.以上是简单应用的几个举例,理解他们,相信你已经能写出满足自己需要的代码了.
TiXmlHandle的使用-简化tinyxml的代码的更多相关文章
- 第7.24节 Python案例详解:使用property函数定义属性简化属性访问代码实现
第7.24节 Python案例详解:使用property函数定义属性简化属性访问代码实现 一. 案例说明 本节将通过一个案例介绍怎么使用property定义快捷的属性访问.案例中使用Rectan ...
- 使用Lombok简化你的代码
一.安装 eclipse 下载:https://projectlombok.org/ 双击安装即可. 重启eclipse/myeclipse 如果有报错,clean一下项目 ...
- iOS开发 使用RMStore简化内购代码 + 内购买订单验证
现在很多的app里面都添加了应用内购买,网上关于苹果证书的生成和设置的教程比较多,这里就不多赘述了,推荐几个个人觉得说的比较详细的网址: http://www.jianshu.com/p/86ac7d ...
- 使用Java注解来简化你的代码
注解(Annotation)就是一种标签,可以插入到源代码中,我们的编译器可以对他们进行逻辑判断,或者我们可以自己写一个工具方法来读取我们源代码中的注解信息,从而实现某种操作.需要申明一点, ...
- UWP: 妙用自定义 Action 以简化并重用代码
相信每一位 App 开发者,在开发过程中,都会有一些代码被反复用到,比如:复制文本,打电话,发短信,发邮件,给应用添加评论等等.在项目之间复制这些代码段,实在不是一个好办法,所以大家可能会把这些代码放 ...
- Idea使用Lombok简化实体类代码
引入相应的maven包 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lo ...
- 别再写getter,setter方法了,用Lombok来简化你的代码吧
前言 在实际开发中,有些代码是重复的.IDE一键生成的,不写不行,写了又觉得代码太臃肿,不美观.如果你也有这种体会,那么,请使用Lombok插件吧,真的非常好用.Lombok的使用也非常简单,都是各种 ...
- 工作中遇到的问题--Hibernate一对多保存简化Service层代码
在创建一方的entity是添加一个增加多方的方法: package com.sim.mfg.data.domain; import java.io.Serializable;import java.u ...
- Map功能简化Python并发代码
<转摘>Python 并行任务技巧 支持Map并发的包文件有两个: Multiprocessing,还有少为人知的但却功能强大的子文件 multiprocessing.dummy. Dum ...
随机推荐
- 【WXS数据类型】Date
生成 date 对象需要使用 getDate函数, 返回一个当前时间的对象. var date = getDate(); //返回当前时间对象 属性: 名称 值类型 说明 [Date].constru ...
- 《Git学习指南》学习笔记(一)
第二章 入门 git的安装 在Linux下,git的安装很简单.以我的系统Deepin/Ubuntu为例,只需在终端敲入sudo apt-get install git即可.其他Linux发行版可尝试 ...
- openstack对接VMware浅析
前言 本文是对openstack对接vmware的浅析,所以本文重点是以下两点: 先了解它的整体架构,搞清楚为什么要用这样的架构: 然后再了解架构中的各个组件,组件提供的主要功能与各个组件之间的交互 ...
- nodejs笔记--与Redis的交互篇(六)
原文地址:http://www.cnblogs.com/zhongweiv/p/node_redis.html 安装前准备 win64: Install python: http://www.pyth ...
- Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片
一. Application用途 1. Application用途 创建Application时机 : Application在启动的时候会调用Application无参的构造方法创建实例; Appl ...
- lintcode-182-删除数字
182-删除数字 给出一个字符串 A, 表示一个 n 位正整数, 删除其中 k 位数字, 使得剩余的数字仍然按照原来的顺序排列产生一个新的正整数. 找到删除 k 个数字之后的最小正整数. N < ...
- (七)类、超类和子类 ——(多态,动态绑定,final类,类型转换,抽象类)
java中所有的继承都是公有继承. 在子类中的构造其内可以初始化超类的公有域,但不能初始化超类的私有域. 因此需要在子类构造前的第一行使用super()语句初始化超类的私有域. 如果超类没有不带参数的 ...
- Objective-C 反射机制
该文章属于<简书 — 刘小壮>原创,特此感谢:<简书 — 刘小壮> http://www.jianshu.com/p/5bbde2480680 了解反射机制 Objective ...
- 【week3】四则运算 单元测试
上一周的四则运算有bug,这次补充正确代码: // 中缀转后缀 public String[] SolveOrder(String[] in, HashMap<String, Integer&g ...
- AppScan工作原理&操作教程
一.AppScan的工作原理 对一个综合性的大型网站来说,可能存在成千上万的页面.以登录界面为例,至少要输入用户名和密码,即该页面存在两个字段,当提交了用户名和密码等登录信息,网站需要检查是否正确,这 ...