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 ...
随机推荐
- Codeforces-A. Shortest path of the king(简单bfs记录路径)
A. Shortest path of the king time limit per test 1 second memory limit per test 64 megabytes input s ...
- 【转】Buff机制及其实际运用
转自 http://bbs.gameres.com/forum.php?mod=viewthread&tid=215027 首先我想说的是,这是一套机制,并不是单独的一个系统,所谓机制就是一种 ...
- vs_code 快捷键
一般的Ctrl+Shift+P,F1显示命令面板按Ctrl+P快速打开,到文件.Ctrl + Shift + N新窗口/实例Ctrl + Shift + W /关闭窗口实例Ctrl +.用户设置Ctr ...
- markdown语法介绍
1. 标题类 每级标题用"# title"表示,共支持6级标题: 2. 段落类 1.建议用换行符控制: 2.用"<p></p>"控制: ...
- SGU 176 Flow construction(有源汇上下界最小流)
Description 176. Flow construction time limit per test: 1 sec. memory limit per test: 4096 KB input: ...
- C语言实验——时间间隔
Description 从键盘输入两个时间点(24小时制),输出两个时间点之间的时间间隔,时间间隔用“小时:分钟:秒”表示. 如:3点5分25秒应表示为--03:05:25.假设两个时间在同一天内,时 ...
- Windows Phone编程回顾
前言 已有一年多没有碰WP相关的开发了. 近期经常看博客园的文章, 发现开发WP应用的同学很多, 其中博问频道关于"WPF", "C#", "WP8& ...
- 福大软工1816:Alpha(10/10)
Alpha 冲刺 (10/10) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务: 文字/口头描述: 1.和愈明.韫月一起对接 2 ...
- ajax与servlet交互(通过JSON),JAVA的arraylist传到前端的方法
所实现的效果:首先从前端(ajax)传参数给servlet,然后servlet经过处理,把arraylist类型的参数以JSON字符串的形式返回给前端(ajax),然后前端经过解析,把JSON字符串解 ...
- s3c2440调试nandflash裸机程序遇到的问题
图挂了可以去 https://github.com/tanghammer/mini2440_peripherals/blob/master/nand/debug_nand.md 按照前面sdram的代 ...