精华内容
下载资源
问答
  • TinyXML2使用教程

    千次阅读 2018-03-11 20:55:36
    在查找TinyXML2使用教程时,感觉写得都很笼统。看了源码,我决定自己写一个教程。 TINYXML2源码地址:https://github.com/leethomason/tinyxml2/blob/master/xmltest.cpp需要在头文件里面添加#include "tiny...

    我最近开始学C++编程。在查找TinyXML2使用教程时,感觉写得都很笼统。看了源码,我决定自己写一个教程。 

    TINYXML2源码地址:https://github.com/leethomason/tinyxml2/blob/master/xmltest.cpp

    需要在头文件里面添加#include "tinyxml2.h"。

    同时编译时加入tinyxml2.cpp。 另声明命令空间 using namespace tinyxml2

    第一个例子:

    int example_1()
    {
    XMLDocument doc;   //用于创建一个doc类。  使用TINYXML2库,必须从这开始。

    doc.LoadFile( "resources/dream.xml" );   //载入一个xml文件。  

            如果我的文件放在/home/kogan。eg.doc.LoadFile(" /home/kogan/test.xml");

            

    return doc.ErrorID();  函数ErrorId()用于检测是否打开。成功返回0.失败返回其他值。

    }

    第二个例子:

    int example_2()
    {
    static const char* xml = "<element/>";   // 定义了一个指向字符串常量的静态指针,并将字符串的地址赋值给指针。
    XMLDocument doc;       //创建一个XMLdocument对象doc
    doc.Parse( xml );            //函数Parse()用于检测xml里面的语法错误。 例如是否配对。也可以打开一个xml文件。例如自己创建一个xml文件。然后将内容拷贝进去。

    return doc.ErrorID();    函数ErrorId()用于检测是否打开。成功返回0.失败返回其他值。

    }

    如何检测xml文件

    #include <iostream>

    #include "tinyxml2.h"

    using std::cout;

    using std::endl;

    using namespace tinyxml2;

    int main()

    {

       XMLDocument doc;     

       doc.Parse("/home/lee/test.xml");  //这里换成你自己的文件路径

       return 0;

    }


    第三个例子:

    int example_3()
    {
    static const char* xml =              // 定义了一个指向字符串常量的静态指针,并将字符串的地址赋值给指针。
    "<?xml version=\"1.0\"?>"
    "<!DOCTYPE PLAY SYSTEM \"play.dtd\">"
    "<PLAY>"
    "<TITLE>A Midsummer Night's Dream</TITLE>"
    "</PLAY>";


    XMLDocument doc;   //创建一个XMLdocument对象doc

    doc.Parse( xml );        //函数Parse()用于检测xml里面的语法错误。 例如是否配对。也可以打开一个xml文件。例如自己创建一个xml文件。然后将内容拷贝进去。

           //首先,我们要能知道xml里面的内容。 XML声明。定义了文档中使用的XML版本。有时候后面还会有字符编码。

    //第二行 官方注释dtd stuff。 (暂时我还不知道怎么翻译,先略过)

      // A Midsummer Night's Dream是TITLE的第一个孩子, 而TITLE又是PLAY的第一个孩子。

    // PLAY又是doc的第一孩子。

           //有两种方式获取TITLE里面的内容
           //第一种: 用XMLElement方法获取TITLE的地址。 然后再创建一个常量指针title来指向titleElement获取到的文本地址。
    XMLElement* titleElement = doc.FirstChildElement( "PLAY" )->FirstChildElement( "TITLE" );
    const char* title = titleElement->GetText();
    printf( "Name of play (1): %s\n", title );

         

          //第二种: 用XMLElement方法获取TITLE的地址。 然后再使用XMLText 来获取TITLE的第一个孩子的文本

    XMLText* textNode = titleElement->FirstChild()->ToText();
    title = textNode->Value();
    printf( "Name of play (2): %s\n", title );


    return doc.ErrorID();

    }

    最后开始实战

    <?xml version="1.0" encoding="utf-8"?><rss version="2.0">
        <channel>
            <title>TechWeb 每日热点推荐 RSS阅读</title>
            <link>http://www.techweb.com.cn/rss/hotnews.xml</link>
            <description>TechWeb晚报,热门人物,TechWeb头条,TechWeb要闻推荐,TechWeb言论</description>
            <copyright>TechWeb.com.cn</copyright>
            <generator>Tiger</generator>
            <lastBuildDate>Wed, 26 Oct 2016 22:16:59 +0800</lastBuildDate>
            <ttl>10</ttl>
            <image>
                <url>http://www.techweb.com.cn/xml.gif</url>
                <title>TechWeb 每日热点推荐 RSS阅读</title>
                <link>http://www.techweb.com.cn/rss/hotnews.xml</link>
            </image>
         <item><title>苹果第四财季净利润下滑19% 这次大中华区也不给力了</title>

    <link>http://www.techweb.com.cn/it/2016-10-26/2420458.shtml</link>

     </channel>

    首先必须要弄清楚谁是谁的孩子,不然程序直接崩溃。  只要没有</...>结尾, 那么当中的所有都是它的孩子。

    展开全文
  • TinyXML教程

    2017-10-09 10:33:00
    TinyXML 是一個小巧的 C++ XML parser Library,十分容易就可以整合到你...TinyXML 使用 node 的觀念來看待 XML 文件樹,TiXmlNode 就是代表著一個節點的 class。 Load and Save TinyXML 使用 TiXmlDocument 這個 cl...

    TinyXML 是一個小巧的 C++ XML parser Library,十分容易就可以整合到你的程式,而且學習曲線十分的短。

    TiXmlNode

    TinyXML 使用 node 的觀念來看待 XML 文件樹,TiXmlNode 就是代表著一個節點的 class。

    Load and Save

    TinyXML 使用 TiXmlDocument 這個 class 來載入/儲存 xml file。A document binds together all the XML pieces. It can be saved, loaded, and printed to the screen.

    
    
    None.gifTiXmlDocument doc;doc.Load( "myfile.xml" );

    存取的時候,要先取得下一層的 Child Element:

    
    
    None.gifTiXmlElement* element = doc.FirstChildElement();

    也可以指定標籤來取得特定的 Element,如同下面的例子:

    
    
    None.gifTiXmlElement* element = doc.FirstChildElement("Node");

    TiXmlElement

    The element is a container class. It has a value, the element name, and can contain other elements, text, comments, and unknowns. Elements also contain an arbitrary number of attributes.
    
    
    None.gif<foo>This is text</foo>

    例如上面的片斷,我們可以使用 GetText() 取得被包起來的文字:
    
    
    None.gifconst char* str = fooElement->GetText();

    TinyXML and wxWidgets

    TinyXML 預設以 UTF-8 編碼,wxWidgets 編譯成 Unicode mode 時,傳入的參數需要轉碼,wxString 可以使用 mb_str() 轉碼,就可以與 TinyXML一起使用。

    如果要轉換 UTF-8 char * 字串為 wxString,使用下列的方式:

    
    
    None.gifconst char* str = fooElement->GetText();wxString myString(str, wxConvUTF8);
    None.gif
    展开全文
  • 介绍 pngquant是一个命令行工具和一个用于有损压缩PNG图像的库。转换显着减少文件大小(通常高达...使用方法很简单,网页上有介绍: 英文网: https://tinypng.com/ 中文网:https://tinify.cn 批量使用教程:使用介绍

    介绍

    pngquant是一个命令行工具和一个用于有损压缩PNG图像的库。转换显着减少文件大小(通常高达70%),并保留完整的alpha透明度。生成的图像与所有网络浏览器和操作系统兼容。

    官网https://pngquant.org/

    GitHub源码https://github.com/kornelski/pngquant

    下载

    forWindowshttps://pngquant.org/pngquant-windows.zip

    forMachttps://pngquant.org/pngquant.tar.bz2

    安装使用

    Windows和mac下都是无需安装的,可以直接使用。

    mac: 终端下进入到下载的文件夹,在当前目录行执行./pngquant [参数] file 即可。

    Windows: 进入下载的文件夹,可以看到两个后缀为.bat脚本,文件名就是它的功能。直接拖拽需要压缩的图片到该文件上,即可自行压缩。

    参数

    See pngquant -h for full list.

    pngquant -h 查看完整的选项列表

    --quality min-max

    min and max are numbers in range 0 (worst) to 100 (perfect), similar to JPEG. pngquant will use the least amount of colors required to meet or exceed the max quality. If conversion results in quality below the min quality the image won’t be saved (if outputting to stdin, 24-bit original will be output) and pngquant will exit with status code 99.

    min和max是范围从0(最差)到100(完美)的数字,类似于JPEG。pngquant将使用最少的颜色来达到或超过最大的质量。如果转换结果的质量低于最低质量,图像将不会被保存(如果输出到stdin,将输出24位的原始图像),pngquant退出并返回状态码99。

        pngquant --quality=65-80 image.png
    

    --ext new.png

    Set custom extension (suffix) for output filename. By default -or8.png or -fs8.png is used. If you use --ext=.png --force options pngquant will overwrite input files in place (use with caution).

        pngquant --ext=_new.png image.png
        pngquant --ext=.png --f image.png
    

    为输出文件设置自定义扩展名(后缀),默认是-or8.png-fs8.png。如果你使用--ext=.png --force选项,pngquant会覆盖输入文件(使用时要小心)。

    -o out.png or --output out.png

    Writes converted file to the given path. When this option is used only single input file is allowed.

    将转换后的文件输出到指定路径下。这个参数只支持单个输入文件。

    --skip-if-larger

    Don’t write converted files if the conversion isn’t worth it.

    如果转换后的文件不值得,则不输出。(只保留比源文件小的转换文件)

    --speed N

    Speed/quality trade-off from 1 (slowest, highest quality, smallest files) to 11 (fastest, less consistent quality, light comperssion). The default is 4. It’s recommended to keep the default, unless you need to generate images in real time (e.g. map tiles). Higher speeds are fine with 256 colors, but don’t handle lower number of colors well.

    速度-质量转换参数从1(时间最长、质量最高、文件最小)到11(速度最快、质量不一致、轻压缩)。默认参数是4。建议保持默认值,除非需要实时生成图像(例如地图文件)。高速下处理256颜色效果不错,但是不能很好处理较少的颜色。

    --nofs

    Disables Floyd-Steinberg dithering.

    禁止Floyd-Steinberg抖动。

    --floyd=0.5

    Controls level of dithering (0 = none, 1 = full). Note that the = character is required.

    控制抖动级别(0=无,1=满)。注意,’ = '字符是必需的。

    --posterize bits

    Reduce precision of the palette by number of bits. Use when the image will be displayed on low-depth screens (e.g. 16-bit displays or compressed textures in ARGB444 format).

    降低调色板精度的位数。当图像显示在低深度屏幕上时使用(例如16位显示器或ARGB444格式的压缩纹理)。

    --strip

    Don’t copy optional PNG chunks. Metadata is always removed on Mac (when using Cocoa reader).

    不要复制可选的PNG块。元数据在Mac上总是被删除(当使用Cocoa reader时)

    实用工具

    shell脚本,批量压缩目录下所有文件

    #!/bin/bash
    
    # 需要手动修改两个变量 
    
    # pngquant 脚本路径
    pngquant_path='./pngquant.exe'
    targetFile='./res'
    
    # png 图片后缀
    suffix='.png' 
    
    # 压缩 png
    function compressPng(){
    	file=$1 #参数1
    	# echo "----- compress "$file
    	if [ -f $file ]; then
    		#判断文件是否以 指定字段结尾
    		echo $file | grep -q -E $suffix 
    		if [ $? -eq 0 ]; then # 0找到 1没找到 >1错误 ,-q:不输出
    			#执行压缩
    			`${pngquant_path} --ext=.png -f $file`
    			flag=$?
    			if [ $flag -eq 0 ]; then # 压缩成功
    				echo "succeed-----"$file 
    			else
    				echo "failed------"$file 
    			fi
    		fi
    	fi
    }
    
    
    # 递归文件夹
    function recursion_dir(){
    	dir=$1
    	cd $dir
    
    	# 遍历
    	for fileName in `ls`; do
    		if [ -f $fileName ]; then
    			compressPng $fileName
    		elif [ -d $fileName ]; then
    			recursion_dir $fileName
    		fi
    	done
    
    	cd ..
    }
    
    
    # 入口函数
    function main(){
    	#只对复制后的目录操作
    	if [ -d $targetFile ]; then
    		local newName=${targetFile}'/../temp-pngquant'
    		cp -r $targetFile ${newName} # 复制的文件保存到 目标文件同级
    		echo 'Compression begins ...'$(date)
    		recursion_dir $newName
    		echo 'Compression is over ...'$(date)
    	else
    		echo 'Erro: Please input target dir full path !'
    	fi
    }
    
    # execute
    main
    

    tinypng

    使用pngquant压缩图片时,如果转换结果的质量低于最低质量,图像将不会被保存,这个时候就出现压缩失败的情况了。这里再介绍一种在线压缩图片的工具:tinypng。使用方法很简单,网页上有介绍:

    英文网: https://tinypng.com/

    中文网:https://tinify.cn

    批量使用教程:使用介绍

    展开全文
  • tinyXML使用例子以及教程和文档,比较详细
  • 1.TinyXML2概述 TinyXML2是simple、small、efficient开源的C++ XML文件解析库,可以很方便的应用到现有的项目之中。非常适合存储简单数据,配置文件,对象序列化等数据量不是很大的操作。 TinyXML2详细介绍与源码...

    原文见 https://blog.csdn.net/K346K346/article/details/48750417

    1.TinyXML2概述

    TinyXML2是simple、small、efficient开源的C++ XML文件解析库,可以很方便的应用到现有的项目之中。非常适合存储简单数据,配置文件,对象序列化等数据量不是很大的操作。

    TinyXML2详细介绍与源码获取方法详见:TinyXML2官网


    2. TinyXML1与TinyXML2对比

    TinyXML1与TinyXML2这两个著名的开源XML文件解析库均出自Lee Thomason之手,向这位满怀开源精神的大家致敬。

    TinyXML2适用于大部分的C/C++项目开发,经得住考验,是最好的选择。较TinyXML1而言,TinyXML2化繁为简,使用时只需要包含两个文件,而TinyXML1需要6个文件,一般生成静态链接库供项目的使用。TinyXML1详细介绍与源码见:TinyXML1官网。TinyXML1用法用例可以参考博文:TinyXML快速入门

    TinyXML2使用了与TinyXML1相似都可API,并且拥有丰富的测试案例。但TinyXML2解析器相对TinyXML1在代码上是完全重写,使其更适合于游戏开发中使用。它使用更少的内存,更快,并使用更少的内存分配。

    TinyXML2无需STL,也放弃了对STL支持。所有字符串查询均使用C风格字符串“const char *”来表示,省去string类型对象的构造,并使代码更简单。

    二者共同点: (1)都使用了简单易用的API。 (2)都是基于DOM(Document Object Model,文档对象模型)的解析器。 (3)都支持UTF-8编码。

    TinyXML2的优点: (1)对大部分大部分的C/C++项目具有普适性。 (2)使用较少的内存(约TinyXML1的40%),速度变得更快。 (3)没有C++的STL的要求。 (4)更接近现代C++的特性,如使用了适当的命名空间。 (5)适当有效的处理了的空白字符(空格,TAB和回车)。

    TinyXML1的优点: (1)可以报告分析错误的位置。 (2)提供一些C++ STL公约支持:流和字符串。 (3)拥有非常成熟和良好的调试代码库。


    3. TinyXML2的用法用例

    TinyXML2的网上教程并不多见,醍醐灌顶,受益匪浅的教程更是凤毛麟角。有的也是蜻蜓点水、参差不齐的泛泛而谈。最终,所能参考的资料也就是官网的文档和示例代码,但却有点晦涩难懂。因此,本文就为了解决这个尴尬的局面,结合官网的资料和网上资源,尽量详细的列出TinyXML2的常见用法用例,不足之处,请留言补充,后续增加修改。

    xml文件本质就是小型的数据库,换个角度来说就是,对数据库有什么操作,那么对xml文件就应能实现什么操作。一般而言,对数据库的操作包括以下几种:新建数据库和对数据库增删查改。那么对应xml文件就是新建xml文件、增加xml文件的节点,删除xml文件的指定节点,查询xml文件指定节点的值,修改xml文件中节点的值。

    使用方法:将tinyxml2.cpp和tinyxml2.h拷贝至项目目录,使用时包含#include “tinyxml2.h”和using namespace tinyxml2。

    使用场景:存储用户信息。

    用户数据表设计如下:

    变量名 描述 类型 长度(字节) 不为空 主键
    UserName 用户名 Vchar 3-20 Y Y
    Password 密码 Char 32 Y N
    Gender 性别 Int 1 N N
    Mobile 电话 Char 11 N N
    Email 电子邮箱 Varchar 1-50 N N

    对应XML文件实现如下:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <DBUSER>
        <User Name=”lvlv” Password =”123456”>
        <Gender></Gender>
        <Mobile ></ Mobile>
        <Email ></ Email >
    </User>
    .
    .
    .
    <DBUSER>

    从中可以看出,XML由三大部分组成,分别是声明、根节点和其它节点。其中xml文件的声明包括三方面的内容:Version、Standalone和Encoding。下面将详细列出常见tinyxml2的用法。

    注意:以下示例代码针对本人下载使用的TinyXML2,官网的TinyXML2在不断的完善和更新当中,最新的TinyXML2和本人的示例代码可能会有出入。本人使用的TinyXML2是2015.9.23从官网下载的,已上传至CSDN下载,见:TinyXML2

    3.1创建XML文件

    示例代码:

    //function:create a xml file
    //param:xmlPath:xml文件路径
    //return:0,成功,非0,失败
    int createXML(const char* xmlPath)
    {
        const char* declaration ="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>";
        XMLDocument doc;
        doc.Parse(declaration);//会覆盖xml所有内容
    
        //添加申明可以使用如下两行
        //XMLDeclaration* declaration=doc.NewDeclaration();
        //doc.InsertFirstChild(declaration);
    
        XMLElement* root=doc.NewElement("DBUSER");
        doc.InsertEndChild(root);
    
        return doc.SaveFile(xmlPath);
    }

    创建结果:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <DBUSER/>

    3.2增加xml文件的节点

    示例代码:

    //用户类
    class User
    {
    public:
        User(){
            gender=0;
        };
    
        User(const string& userName, const string& password, int gender, const string& mobile, const string& email){
            this->userName=userName;
            this->password=password;
            this->gender=gender;
            this->mobile=mobile;
            this->email=email;
        };
    
        string userName;
        string password;
        int gender;
        string mobile;
        string email;
    };
    
    //function:insert XML node
    //param:xmlPath:xml文件路径; user:用户对象
    //return:0:成功; 非0:失败
    int insertXMLNode(const char* xmlPath,const User& user)
    {
        XMLDocument doc;
        int res=doc.LoadFile(xmlPath);
        if(res!=0)
        {
            cout<<"load xml file failed"<<endl;
            return res;
        }
        XMLElement* root=doc.RootElement();
    
        XMLElement* userNode = doc.NewElement("User");
        userNode->SetAttribute("Name",user.userName.c_str());
        userNode->SetAttribute("Password ",user.password.c_str());
        root->InsertEndChild(userNode);
    
        XMLElement* gender = doc.NewElement("Gender");
        XMLText* genderText=doc.NewText(itoa(user.gender));
        gender->InsertEndChild(genderText);
        userNode->InsertEndChild(gender);
    
        XMLElement* mobile = doc.NewElement("Mobile");
        mobile->InsertEndChild(doc.NewText(user.mobile.c_str()));
        userNode->InsertEndChild(mobile);
    
        XMLElement* email = doc.NewElement("Email");
        email->InsertEndChild(doc.NewText(user.email.c_str()));
        userNode->InsertEndChild(email);
    
        return doc.SaveFile(xmlPath);
    }

    创建结果:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <DBUSER>
        <User Name="lvlv" Password ="12346">
            <Gender>1</Gender>
            <Mobile>15813354926</Mobile>
            <Email>1589276509@qq.com</Email>
        </User>
    </DBUSER>

    3.3查询xml文件的指定节点

    Xml文件中,一个用户节点存储一个用户的信息。因此,对用户信息的增删查改,即无论查询节点、删除节点、修改节点和增加节点,都需要获取需要操作的节点。那么先实现一个根据用户名获取节点指针的函数:

    //function:根据用户名获取用户节点
    //param:root:xml文件根节点;userName:用户名
    //return:用户节点
    XMLElement* queryUserNodeByName(XMLElement* root,const string& userName)
    {
    
        XMLElement* userNode=root->FirstChildElement("User");
        while(userNode!=NULL)
        {
            if(userNode->Attribute("Name")==userName)
                break;
            userNode=userNode->NextSiblingElement();//下一个兄弟节点
        }
        return userNode;
    }

    在以上函数的基础上,获取用户信息的函数:

    User* queryUserByName(const char* xmlPath,const string& userName)
    {
        XMLDocument doc;
        if(doc.LoadFile(xmlPath)!=0)
        {
            cout<<"load xml file failed"<<endl;
            return NULL;
        }
        XMLElement* root=doc.RootElement();
        XMLElement* userNode=queryUserNodeByName(root,userName);
    
        if(userNode!=NULL)  //searched successfully
        {
            User* user=new User();
            user->userName=userName;
            user->password=userNode->Attribute("Password");
            XMLElement* genderNode=userNode->FirstChildElement("Gender");
            user->gender=atoi(genderNode->GetText());
            XMLElement* mobileNode=userNode->FirstChildElement("Mobile");
            user->mobile=mobileNode->GetText();     
            XMLElement* emailNode=userNode->FirstChildElement("Email");
            user->email=emailNode->GetText();           
            return user;
        }
        return NULL;
    }

    3.4修改xml文件的指定节点

    //function:修改指定节点内容
    //param:xmlPath:xml文件路径;user:用户对象
    //return:bool
    bool updateUser(const char* xmlPath,User* user)
    {
        XMLDocument doc;
        if(doc.LoadFile(xmlPath)!=0)
        {
            cout<<"load xml file failed"<<endl;
            return false;
        }
        XMLElement* root=doc.RootElement();
        XMLElement* userNode=queryUserNodeByName(root,user->userName);
    
        if(userNode!=NULL)
        {
            if(user->password!=userNode->Attribute("Password"))
            {
                userNode->SetAttribute("Password",user->password.c_str());  //修改属性
            }
            XMLElement* genderNode=userNode->FirstChildElement("Gender");
            if(user->gender!=atoi(genderNode->GetText()))  
            {
                genderNode->SetText(itoa(user->gender).c_str());   //修改节点内容
            }
            XMLElement* mobileNode=userNode->FirstChildElement("Mobile");
            if(user->mobile!=mobileNode->GetText())
            {
                mobileNode->SetText(user->mobile.c_str());
            }
            XMLElement* emailNode=userNode->FirstChildElement("Email");
            if(user->email!=emailNode->GetText())
            {
                emailNode->SetText(user->email.c_str());
            }
            if(doc.SaveFile(xmlPath)==0)
                return true;
        }
        return false;
    }

    验证代码:

    int main(int argc,char* argv[])
    {
        //修改用户信息
        User user("lvlv","00001111",0,"13995648666","1586666@qq.com");
        if(updateUser("./user.xml",&user))
            cout<<"update successfully"<<endl;
        else
            cout<<"update failed"<<endl;
        return 0;
    }

    修改结果:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <DBUSER>
        <User Name="lvlv" Password="00001111">
            <Gender>0</Gender>
            <Mobile>13995648666</Mobile>
            <Email>1586666@qq.com</Email>
    </User>
    </DBUSER>

    3.5删除xml文件的指定节点的信息

    //function:删除指定节点内容
    //param:xmlPath:xml文件路径;userName:用户名称
    //return:bool
    bool deleteUserByName(const char* xmlPath,const string& userName)
    {
        XMLDocument doc;
        if(doc.LoadFile(xmlPath)!=0)
        {
            cout<<"load xml file failed"<<endl;
            return false;
        }
        XMLElement* root=doc.RootElement();
        //doc.DeleteNode(root);//删除xml所有节点
        XMLElement* userNode=queryUserNodeByName(root,userName);
        if(userNode!=NULL)
        {
            userNode->DeleteAttribute("Password");//删除属性
            XMLElement* emailNode=userNode->FirstChildElement("Email");
            userNode->DeleteChild(emailNode); //删除指定节点
            //userNode->DeleteChildren();//删除节点的所有孩子节点
            if(doc.SaveFile(xmlPath)==0)
                return true;
        }
        return false;
    }

    验证代码:

    int main(int argc,char* argv[])
    {
        //删除用户某些信息
        if(deleteUserByName("./user.xml","lvlv"))
            cout<<"delete successfully"<<endl;
        else
            cout<<"delete failed"<<endl;
        return 0;
    }

    删除结果:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <DBUSER>
        <User Name="lvlv">
            <Gender>10</Gender>
            <Mobile>13995648666</Mobile>
    </User>
    </DBUSER>

    4.其它常见用例

    4.1获取xml文件申明

    //function:获取xml文件申明
    //param:xmlPath:xml文件路径;strDecl:xml申明
    //return:bool
    bool getXMLDeclaration(const char* xmlPath,string& strDecl)
    {
        XMLDocument doc;
        if(doc.LoadFile(xmlPath)!=0)
        {
            cout<<"load xml file failed"<<endl;
            return false;
        }
        XMLNode* decl=doc.FirstChild();  
        if (NULL!=decl)  
        {  
            XMLDeclaration* declaration =decl->ToDeclaration();  
            if (NULL!=declaration)  
            {  
                  strDecl = declaration->Value();
                  return true;
            } 
        }
        return false;
    }

    验证代码:

    int main(int argc,char* argv[])
    {
        //获取xml文件申明
        string strDecl;
        if(getXMLDeclaration("./user.xml",strDecl))
        {
            cout<<"declaration:"<<strDecl<<endl;
        }
        return 0;
    }

    验证结果:

    declaration:xml version="1.0" encoding="UTF-8" standalone="no"

    4.2打印xml文件至标准输出

    //function:将xml文件内容输出到标准输出
    //param:xmlPath:xml文件路径
    void print(const char* xmlPath)
    {
        XMLDocument doc;
        if(doc.LoadFile("./user.xml")!=0)
        {
            cout<<"load xml file failed"<<endl;
            return;
        }
        doc.Print();
    }

    4.3 xml文件内容输出至内存

    XMLPrinter printer;
    doc.Print( &printer );
    // printer.CStr() has a const char* to the XML

    4.4如何解析xml格式的字符串信息,不是文件中的

    采用tinyXML中的TiXmlDocument类的Parse方法即可。例如:
    const char * xmlString = "<?xml version=\"1.0\" standalone=no>\n<!– Our to do list data –>\n<ToDo>\n<Item priority=\"1\"> <bold>Toy store!</bold>\n</Item>\n<Item priority=\"2\"> Do bills</Item>\n</ToDo> ";
    XMLDocument *doc = new XMLDocument();
    doc->Parse(xmlString);
     
    XMLElement * rootElement = doc->RootElement();
    const char * rootName = rootElement->Value();

    展开全文
  • 使用darknet训练yolo模型1.下载源码darknet2.下载yolov4-tiny训练权重3.修改文件参数参考资料 前言 浏览了一些网上资料自己学着创建yolov4-tiny模型,此文仅供参考。 一、准备数据集 首先需要准备的是数据集。我用...
  • tinyos编程英文教程

    2014-03-24 10:12:47
    一个很全很详细的tinyos编程外文教程,将nesc与其他语言如C,C++,JAVA做了对比,讲述起不同与特殊点,鞭辟入里,适合初学者使用
  • tiny6410刷机教程

    2018-04-25 11:18:11
    首先制作sd卡 bois 使用sd-flasher格式化sd卡,Scan能找到sd卡,Available项为no时 点击Relayout ,再次Scan后为yes,找到superboot-2011114.bin文件(文件目录不能为中文),点击fuse,会提示succeed,插入arm开发板,...
  • tiny c compiler又称TCC编译器,这是针对开发人员打造的一款实用编程工具,拥有性能稳定、操作简单、编译速度快的持点,并可以与最新的C语言标准兼容,连接后就可以进行程序的编译了,大大地提升编程效率,有需要的...
  • tiny-cnn安装教程

    千次阅读 2017-09-14 22:18:39
    tiny-cnn最近在看caffe源码,看得有点吃力,可能...这个框架也是用c++写的,依赖很少,号称只要引用头文件就可使用的框架。于是我打算开始阅读这个开源代码,一方面帮助自己熟悉cnn算法的实现,另外一方面也可以提高c
  • TinyOS系统经典PPT教程

    2011-12-09 12:23:57
    TinyOS系统经典PPT教程,适合与WSN的初学人员自学,或者对于教学使用
  • TinyXml 使用指南

    千次阅读 2018-04-23 14:49:08
    最近在学习TinyXml的使用,发现了一篇非常好的教程文档,特地转载一下原文地址:https://www.cnblogs.com/cy568searchx/p/3670400.html
  • TinyXML入门教程

    千次阅读 2010-05-03 10:29:00
    什么是XML?XML全称EXtensible Markup Language,翻译为可扩展标记语言,简而言之就是你可以自定义数据的标识,以此来区分各种不同...上图就是我系统中一个xml文件的图标,使用VC2005打开它,你可以看到如下内容:XML也
  • tinyXML入门教程

    2010-05-05 15:50:00
    什么是XML?XML全称EXtensible Markup Language,翻译为可扩展标记语言,简而言之就是你可以自定义数据的标识,以此来区分各种不同的数据,以...XML文件通常就是一个文本文件,可以使用任何编码。 上图就是我系统中一个x
  • 取消将random=0(需要修改几处) ④GPU动态监控 新打开一个终端,输入: watch -n 1 -d nvidia-smi 其中各部分的含义为: 参考资料: [1] Darknet yolov3-tiny 训练自己的数据集步骤 [2] 实用教程使用YOLOv3训练...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 160
精华内容 64
关键字:

tiny使用教程