热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

tinyxml学习一

在TinyXML中,根据XML的各种元素来定义了一些类:TiXmlBase:整个TinyXML模型的基类。TiXmlAttribute&#

在TinyXML中,根据XML的各种元素来定义了一些类:
        TiXmlBase:整个TinyXML模型的基类。
        TiXmlAttribute:对应于XML中的元素的属性。
        TiXmlNode:对应于DOM结构中的节点。
        TiXmlComment:对应于XML中的注释。
        TiXmlDeclaration&#xff1a;对应于XML中的申明部分&#xff0c;即<&#xff1f;versiong&#61;"1.0" ?>。
        TiXmlDocument&#xff1a;对应于XML的整个文档。
        TiXmlElement&#xff1a;对应于XML的元素。
        TiXmlText&#xff1a;对应于XML的文字部分。
        TiXmlUnknown&#xff1a;对应于XML的未知部分。 
        TiXmlHandler&#xff1a;定义了针对XML的一些操作。

例如:

xml version&#61;"1.0" standalone&#61;no>


 Go to the Toy store!
 Do bills
 



整个对象树&#xff1a; 

TiXmlDocument "demo.xml"
TiXmlDeclaration "version&#61;’1.0′" "standalone&#61;no"
TiXmlComment " Our to do list data"
TiXmlElement "ToDo"
TiXmlElement "Item" Attribtutes: priority &#61; 1
TiXmlText "Go to the "
TiXmlElement "bold"
TiXmlText "Toy store!"
TiXmlElement "Item" Attributes: priority&#61;2
TiXmlText "Do bills" 

tinyXML中,用FirstChild&#xff08;"名字"&#xff09;时,FirstChild函数的点与要找的点必父子

句柄

想要健壮地读取一个XML文档&#xff0c;检查方法调用后的返回值是否为null是很重要的。一种安全的检错实现可能会产生像这样的代码&#xff1a; 

 

TiXmlElement* root &#61; document.FirstChildElement( "Document" );
if ( root )
{
TiXmlElement* element &#61; root->FirstChildElement( "Element" );
if ( element )
{
TiXmlElement* child &#61; element->FirstChildElement( "Child" );
if ( child )
{
TiXmlElement* child2 &#61; child->NextSiblingElement( "Child" );
if ( child2 )
{
// Finally do something useful. 



用句柄的话就不会这么冗长了&#xff0c;使用TiXmlHandle类&#xff0c;前面的代码就会变成这样&#xff1a; 

TiXmlHandle docHandle( &document );
TiXmlElement* child2 &#61; docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement();
if ( child2 )
{
// do something useful 




一、读取XML,设置节点文本


如下XML片段:




xml version&#61;"1.0" encoding&#61;"UTF-8" standalone&#61;"yes" ?>
<ZXML>
    <ZAPP>
         <VBS_RUNTIME_PARAMS>
               <BROADCAST_VERSION info&#61;"版本">8BROADCAST_VERSION>
               <Broadcast>
                <FileCount info&#61;"资源文件个数">69FileCount>
                <SOURCE_1>
                    <ID info&#61;"图片编号">1ID>
                    <Version info&#61;"图片版本">1Version>
                    <Path info&#61;"图片路径">/mnt/share/1.bmpPath>
                    <FileMode info&#61;"文件处理模式">0FileMode>
                SOURCE_1>
                <SOURCE_2>
                    <Path info&#61;"图片路径">/mnt/share/2.bmpPath>
                    <ID info&#61;"图片编号">2ID>
                    <Version info&#61;"图片版本">1Version>
                    <FileMode info&#61;"文件处理模式">0FileMode>
                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 &#61; docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("VBS_RUNTIME_PARAMS").FirstChildElement("BROADCAST_VERSION").ToElement();
    TiXmlNode * oldnode &#61;  Broadcast_ver->FirstChild();
    const char *ver &#61; Broadcast_ver->GetText();
    int oldVer &#61; atoi(ver);
    CString newVer;
    newVer.Format("%d",oldVer&#43;1);
    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 &#61; docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("VBS_RUNTIME_PARAMS").ToElement();

    TiXmlNode * node &#61;  Broadcast_ver->FirstChild("BROADCAST_VERSION");

    Broadcast_ver->RemoveChild(node);



也可以删除整个SOURCE_1节点:




TiXmlHandle docHandle( &doc );
    TiXmlElement* Broadcast &#61; docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("VBS_RUNTIME_PARAMS").FirstChild("Broadcast").ToElement();

    TiXmlNode * node &#61;  Broadcast->FirstChild("SOURCE_1");

    Broadcast->RemoveChild(node);



删除BROADCAST_VERSION的info属性:




TiXmlHandle docHandle( &doc );
    TiXmlElement* Broadcast_ver &#61; 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 &#61; docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("VBS_RUNTIME_PARAMS").FirstChild("Broadcast").ToElement();
    TiXmlElement* Broadcast_Pid &#61; new TiXmlElement("BROADCAST_PID");
    TiXmlText *text &#61;new TiXmlText("7215");
    Broadcast_Pid->SetAttribute("info","the pid");
    Broadcast_Pid->LinkEndChild(text);
    Broadcast->LinkEndChild(Broadcast_Pid);



将在SOURCE_3后添加新的节点:




<BROADCAST_PID info&#61;"the pid">7215BROADCAST_PID>



四,最后说一下中文乱码的问题



乱码是由于GB2312与UTF8之间转换不当造成的,tinyxml在处理UTF8本身没有问题,当你打开一个UTF8的文档,可以在加载的时候指定UTF8的方式,或者文档声明处指明的编码格式,tinyxml会按照相应的编码格式加载,但很多时候当我们输出或写入中文字段时会出现乱码,无论在内存,还是打印出来的内容.这是因为我们的软件通常是GB2312编码,而读取或写入的内容是UTF8,自然就会出错.可以借助网上的两个函数来实现转换(原作者不详):




    void ConvertUtf8ToGBK(CString& strUtf8) 
    {
        int len&#61;MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0);
        unsigned short * wszGBK &#61; new unsigned short[len&#43;1];
        memset(wszGBK, 0, len * 2 &#43; 2);
        MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, wszGBK, len);

        len &#61; WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
        char *szGBK&#61;new char[len &#43; 1];
        memset(szGBK, 0, len &#43; 1);
        WideCharToMultiByte (CP_ACP, 0, wszGBK, -1, szGBK, len, NULL,NULL);

        strUtf8 &#61; szGBK;
        delete[] szGBK;
        delete[] wszGBK;
    }



    void ConvertGBKToUtf8(CString& strGBK)
    {
        int len&#61;MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
        unsigned short * wszUtf8 &#61; new unsigned short[len&#43;1];
        memset(wszUtf8, 0, len * 2 &#43; 2);
        MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, wszUtf8, len);

        len &#61; WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL);
        char *szUtf8&#61;new char[len &#43; 1];
        memset(szUtf8, 0, len &#43; 1);
        WideCharToMultiByte (CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL,NULL);

        strGBK &#61; szUtf8;
        delete[] szUtf8;
        delete[] wszUtf8;
    }





推荐阅读
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 摘要: 在测试数据中,生成中文姓名是一个常见的需求。本文介绍了使用C#编写的随机生成中文姓名的方法,并分享了相关代码。作者欢迎读者提出意见和建议。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
  • 本文介绍了使用C++Builder实现获取USB优盘序列号的方法,包括相关的代码和说明。通过该方法,可以获取指定盘符的USB优盘序列号,并将其存放在缓冲中。该方法可以在Windows系统中有效地获取USB优盘序列号,并且适用于C++Builder开发环境。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 现在学vb6还靠得住么?语言只是工具,关键是思想。程序=算法+数据结构。除了汇编,其他语言都靠不住。随着时代的进步,很多语言跟不上开发的要求。从面向过程到面向对象,与其说是思想的进步,不如说是为了适应高速开发。除了底层汇编语言,还有那些能适应高速开发的语言。每种语言都是很有趣的。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • Windows7企业版怎样存储安全新功能详解
    本文介绍了电脑公司发布的GHOST WIN7 SP1 X64 通用特别版 V2019.12,软件大小为5.71 GB,支持简体中文,属于国产软件,免费使用。文章还提到了用户评分和软件分类为Win7系统,运行环境为Windows。同时,文章还介绍了平台检测结果,无插件,通过了360、腾讯、金山和瑞星的检测。此外,文章还提到了本地下载文件大小为5.71 GB,需要先下载高速下载器才能进行高速下载。最后,文章详细解释了Windows7企业版的存储安全新功能。 ... [详细]
author-avatar
崔显莉京_716
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有