TinyXML2读取和创建XML文件

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;
}
    读取结果:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

axios : Promise based HTTP client for the browser and node.jsaxios

Promise based HTTP client for the browser and node.js

1492
来自专栏石奈子的Java之路

原 荐 SpringBoot 2.0 系列0

4603
来自专栏SpringSpace.cn

Spring Boot 2.0 项目实现自同步AD域账号 顶

在通过Spring Boot的自动化装配功能及JDK自带的LDAP模块,可通过如下几个简单步骤实现业务系统自动同步AD域账号功能。

2963
来自专栏算法修养

PAT 甲级 1025 PAT Ranking

1025. PAT Ranking (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题...

31010
来自专栏技术小黑屋

应用认领那些事

最近公司的一款产品提交国内市场,发现有些国内市场提示需要进行应用认领。原因就是别人(或者市场抓取)已经在我们之前将这个应用提交到了该市场。认领成功后,这个应用就...

1732
来自专栏技术专栏

logback日志写入kafka遇到的那些坑

这两天在学习storm实时流的时候需要将logback日志写入kafka,这期间遇到了很多坑,这里把遇到的坑和解决的问题记录一下,和大家共勉

1.5K3
来自专栏颇忒脱的技术博客

Spring、Spring Boot和TestNG测试指南 - 测试AOP

Spring提供了一套AOP工具,但是当你把各种Aspect写完之后,如何确定这些Aspect都正确的应用到目标Bean上了呢?本章将举例说明如何对Spring...

1652
来自专栏函数式编程语言及工具

ScalaPB(5):用akka-stream实现reactive-gRPC

2183
来自专栏菩提树下的杨过

silverlight:ListBox中如何取得DateTemplate/ItemsPanelTemplate中的命名控件?

Xaml如下: <UserControl x:Class="ToolsTest.Test"     xmlns="http://schemas.microsof...

1925
来自专栏Jerry的SAP技术分享

使用SAP云平台 + JNDI访问Internet Service

以Internet Service http://maps.googleapis.com/maps/api/distancematrix/xml?origins...

3423

扫码关注云+社区

领取腾讯云代金券