TinyXML2是simple、small、efficient C++ XML文件解析库!方便易于使用,是对TinyXML的升级改写!源码见本人上传到CSDN的TinyXML2.rar资源:http://download.csdn.net/detail/k346k346/8500915,或者到官网下载:https://github.com/leethomason/tinyxml2。

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

1.创建XML文件。注意:xml文件必须先创建,可由fopen()进行创建,再交由XMLDocument进行写入操作。

int createTinyXML2(string xmlPath)
{
    FILE* fp=NULL;
    fp=fopen(xmlPath.c_str(),"w+");//创建空xml文件
    fclose(fp);
    XMLDocument doc;
    doc.LoadFile(xmlPath);//载入xml文件
    XMLDeclaration* declaration=doc.NewDeclaration();//添加xml文件头申明
    doc.InsertFirstChild(declaration);
    XMLElement *Root = doc.NewElement("Root");
    doc.InsertEndChild(Root);
    //insert Head
    XMLElement* Head=doc.NewElement("Head");
    Root->InsertEndChild(Head);
    //insert Create_Time
    time_t rawtime;//time_t为long型
    time(&rawtime);//获取从1970.1.1起的秒数
    struct tm *temp = localtime(&rawtime);
    char time_str[32];
    sprintf(time_str, "%04d-%02d-%02d %02d:%02d:%02d", temp->tm_year + 1900, temp->tm_mon + 1, temp->tm_mday,\
       temp->tm_hour, temp->tm_min, temp->tm_sec);
    XMLElement* Create_Time = doc.NewElement("Create_Time");
    Create_Time->InsertFirstChild(doc.NewText(time_str));
    Head->InsertEndChild(Create_Time);

    //insert Algorithm
    XMLElement* Algorithm = doc.NewElement("Algorithm");
    Algorithm->InsertFirstChild(doc.NewText("MD5"));
    Algorithm->SetAttribute("ID",1);
    Head->InsertEndChild(Algorithm);
    //insert cipher_Num
    XMLElement* Cipher_Num = doc.NewElement("Cipher_Num");
    Cipher_Num->InsertFirstChild(doc.NewText("500"));
    Cipher_Num->SetAttribute("ID",2);
    Head->InsertEndChild(Cipher_Num);

    int targetNum=3;
    while (targetNum)
    {
       //insert Target
       Root->InsertEndChild(doc.NewElement("Target"));
       XMLElement* Target = Root->LastChildElement("Target");

       //insert HashValue to Target Node
       XMLElement* HashValue = doc.NewElement("HashValue");
       HashValue->InsertFirstChild(doc.NewText("5555"));
       Target->InsertEndChild(HashValue);
       //insert Salt to Target Node
       XMLElement* Salt = doc.NewElement("Salt");
       Salt->InsertFirstChild(doc.NewText("555"));
       Target->InsertEndChild(Salt);
       targetNum--;
     }
    int result=doc.SaveFile(xmlPath.c_str());
    return result;
}
    结果截图:

    
    2.读取XML文件
int readTinyXML2(string xmlPath)
{
    XMLDocument doc;
    doc.LoadFile(xmlPath.c_str());
    if(doc.Error())
    {
        cout<<"Read "<<xmlPath<<" file failed! "<<endl;
        return -1;
    }
    XMLElement *root = doc.RootElement();
    XMLElement *Head=root->FirstChildElement("Head");
    XMLElement *HeadChildNode=Head->FirstChildElement("Create_Time");
    string Create_Time=HeadChildNode->GetText();
    HeadChildNode=Head->FirstChildElement("Algorithm");
    string Algorithm=HeadChildNode->GetText();
    string AlgorithmID=HeadChildNode->Attribute("ID");
    HeadChildNode=Head->FirstChildElement("Cipher_Num");
    string Cipher_Num=HeadChildNode->GetText();
    string Cipher_NumID=HeadChildNode->Attribute("ID");

    XMLElement *Target=root->FirstChildElement("Target");
    XMLElement *TargetChildNode=NULL;
    int targetNum=3;
    char hash[3][32]={NULL};
    char salt[3][32]={NULL};
    for(int i=0;i<targetNum;i++)
    {
      TargetChildNode=Target->FirstChildElement("HashValue");
      strcpy(hash[i],TargetChildNode->GetText());
      TargetChildNode=Target->FirstChildElement("Salt");
      strcpy(salt[i],TargetChildNode->GetText());
      Target=Target->NextSiblingElement("Target");
    }
    //verify the read result from xml
    std::cout<<"Create_Time:"<<Create_Time<<endl;
    std::cout<<"Algorithm:"<<Algorithm<<" ID:"<<AlgorithmID<<endl;
    std::cout<<"Cipher_Num:"<<Cipher_Num<<" ID:"<<Cipher_NumID<<endl;
    for(int i=0;i<targetNum;i++)
    {
         std::cout<<"hash["<<i<<"]:"<<hash[i]<<endl;
         std::cout<<"salt["<<i<<"]:"<<salt[i]<<endl;
    }
    return 0;
}
    读取结果:
    

版权声明:本文为博主原创文章,未经博主允许不得转载。

TinyXML2读取和创建XML文件 分类: C/C++ 2015-03-14 13:29 94人阅读 评论(0) 收藏的更多相关文章

  1. 给EditText的drawableRight属性的图片设置点击事件 分类: 学习笔记 android 2015-07-06 13:20 134人阅读 评论(0) 收藏

    这个方法是通用的,不仅仅适用于EditText,也适用于TextView.AutoCompleteTextView等控件. Google官方API并没有给出一个直接的方法用来设置右边图片的点击事件,所 ...

  2. Eclipse 快捷键大全 分类: C_OHTERS 2014-06-01 13:05 332人阅读 评论(0) 收藏

      精选常用: 1.  ctrl+shift+r:打开资源 这可能是所有快捷键组合中最省时间的了.这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如a ...

  3. android开发之broadcast学习笔记 分类: android 学习笔记 2015-07-19 16:33 32人阅读 评论(0) 收藏

    android中的广播用的太多了,今天稍微总结一下. 按注册方式分为两种: 1.静态注册广播: 静态注册广播就是在androidManifest.xml文件中注册广播,假设我们要实现这样一个效果,在一 ...

  4. Mahout快速入门教程 分类: B10_计算机基础 2015-03-07 16:20 508人阅读 评论(0) 收藏

    Mahout 是一个很强大的数据挖掘工具,是一个分布式机器学习算法的集合,包括:被称为Taste的分布式协同过滤的实现.分类.聚类等.Mahout最大的优点就是基于hadoop实现,把很多以前运行于单 ...

  5. 随机带权选取文件中一行 分类: linux c/c++ 2014-06-02 00:11 344人阅读 评论(0) 收藏

    本程序实现从文件中随即选取一行,每行被选中的概率与改行长度成正比. 程序用一次遍历,实现带权随机选取. 算法:假设第i行权重wi(i=1...n).读取到文件第i行时,以概率wi/(w1+w2+... ...

  6. AndroidManifest.xml中的application中的name属性 分类: android 学习笔记 2015-07-17 16:51 116人阅读 评论(0) 收藏

    被这个不起眼的属性折磨了一天,终于解决了. 由于项目需要,要合并两个android应用,于是拷代码,拷布局文件,拷values,所有的都搞定之后程序还是频频崩溃,一直没有找到原因,学android时间 ...

  7. JavaScript、Ajax与jQuery的关系 分类: C1_HTML/JS/JQUERY 2014-07-31 10:15 3388人阅读 评论(0) 收藏

    简单总结: 1.JS是一门前端语言. 2.Ajax是一门技术,它提供了异步更新的机制,使用客户端与服务器间交换数据而非整个页面文档,实现页面的局部更新. 3.jQuery是一个框架,它对JS进行了封装 ...

  8. .net 实现Office文件预览 Word PPT Excel 2015-01-23 08:47 63人阅读 评论(0) 收藏

    先打个广告: .Net交流群:252713569 本人QQ :524808775 欢迎技术探讨, 近期公司要求上传的PPT和Word都需要可以在线预览.. 小弟我是从来没有接触过这一块的东西 感觉很棘 ...

  9. XHTML 结构化:使用 XHTML 重构网站 分类: C1_HTML/JS/JQUERY 2014-07-31 15:58 249人阅读 评论(0) 收藏

    http://www.w3school.com.cn/xhtml/xhtml_structural_01.asp 我们曾经为本节撰写的标题是:"XHTML : 简单的规则,容易的方针.&qu ...

随机推荐

  1. MyEclipse取消验证Js的两种方法

    MyEclipse取消验证Js的两种方法 作者: 字体:[增加 减小] 类型:转载 通过js写一个web工程的相关页面时感觉很卡,修改内存也不行下面有两种解决方法,大家可以尝试下 前言:有时我们通过j ...

  2. C++ primer的第二章的主要内容

    这第二章主要是介绍了C++中基本的内置数据类型:整型与浮点型.介绍了什么是变量的过程中了解到了左值与右值的概念.左值是可以出现在赋值语句的左边或者右边,也就是说可以放在等号的左右两边,而右值只能是出现 ...

  3. Listview没有优化之前

    MainActivity.java package com.example.listviewdemo4; import java.util.ArrayList; import java.util.Ha ...

  4. ACM - 动态规划专题 题目整理

    CodeForces 429B  Working out 预处理出从四个顶点到某个位置的最大权值,再枚举相遇点,相遇的时候只有两种情况,取最优解即可. #include<iostream> ...

  5. Allegro PCB SI (2)

    整理一下在电研院学的si (虽然彩超的si在频率15Mhz以上后,si是失真的.昨晚遇到孔大哥也是这样说的,板级仿真,要layout过硬,然后找到合适的top test point) Allegro ...

  6. [Python陷阱]os.system调用shell脚本获取返回值

    当前有shell个脚本/tmp/test.sh,内容如下: #!/bin/bashexit 11 使用Python的os.system调用,获取返回值是: >>> ret=os.sy ...

  7. BZOJ 2501 Soda Machine

    BIT+离散化. #include<iostream> #include<cstdio> #include<cstring> #include<algorit ...

  8. iOS开发:JavaScriptCore.framework的简单使用--JS与OC的交互篇

    iOS7之后苹果为众猿推出了JavaScriptCore.framework这个框架,这个框架为大家在与JS交互上提供了很大帮助,可以在html界面上调用OC方法并传参,也可以在OC上调用JS方法并传 ...

  9. Entityframework更新数据和插入数据

    public bool UpdateEmloyeeInfo(EmployeInfo employeInfo) { bool flg = false; try { using (UserManageDB ...

  10. C,C++宏中#与##的讲解[转]

    MoreWindows 专注于Windows编程 C,C++宏中#与##的讲解 文中__FILE__与示例1可以参见<使用ANSI C and Microsoft C++中常用的预定义宏> ...