C++解析XML文件(TinyXML)

简介

TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。


TinyXML库下载

本文所用库文件来自

TinyXML 下载 |SourceForge.nethttps://sourceforge.net/projects/tinyxml/*请注意*TinyXML开发已经停止,所有开发都已转移到TinyXML-2。TinyXML-2 可在https://github.com/leethomason/tinyxml2


库目录简介

将库文件压缩包解压后,即可看到以下文件内容:

其中,核心库文件即为

tinystr.cpp

tinystr.h

tinyxml.cpp

tinyxml.h

tinyxmlerror.cpp

tinyxmlparser.cpp

其他文件是官方给的示例工程文件,如果电脑安装了VS,可以打开tinyxml.sln工程文件,查看官方示例程序。


库使用讲解

官方给的示例程序有点复杂。因此,笔者参考了一下各种资料,简单做了些小例子,方便刚使用这个库的同学上手。

首先我们需要了解库中几个重要的对象:

TiXmlDocument:一个XML的文档对象

TiXmlElement:一个元素对象

顾名思义,一个XML文件对应着一个TiXmlDocument;XML文件中每个树节点,对应一个TiXmlElement。一个节点与子节点的连接关系,即一个元素对象和子元素对象的连接关系。

TiXmlElement下有一些方法,能够实现数据的载入和元素之间的连接:

TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node ):元素连接

void TiXmlElement::SetAttribute( const char * cname, const char * cvalue ):设置节点的属性和值


库使用示例

直接上代码

复制代码
// tinyxml-test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <stdio.h>
#include "tinystr.h"
#include "tinyxml.h"

using namespace std;

void creatXmlFile();
void ReadXmlFile();

int main()
{
    creatXmlFile();
    ReadXmlFile();
}


void creatXmlFile()
{
    TiXmlDocument* myDocument = new TiXmlDocument();
    TiXmlElement* RootElement = new TiXmlElement("Persons");

    myDocument->LinkEndChild(RootElement);
    TiXmlElement* PersonElement = new TiXmlElement("Person");
    RootElement->LinkEndChild(PersonElement);
    PersonElement->SetAttribute("ID", "1");
    TiXmlElement* NameElement = new TiXmlElement("name");
    TiXmlElement* AgeElement = new TiXmlElement("age");
    PersonElement->LinkEndChild(NameElement);
    PersonElement->LinkEndChild(AgeElement);
    TiXmlText* NameContent = new TiXmlText("周星星");
    TiXmlText* AgeContent = new TiXmlText("22");
    NameElement->LinkEndChild(NameContent);
    AgeElement->LinkEndChild(AgeContent);

    PersonElement = new TiXmlElement("Person");
    RootElement->LinkEndChild(PersonElement);
    PersonElement->SetAttribute("ID", "2");
    NameElement = new TiXmlElement("name");
    AgeElement = new TiXmlElement("age");
    PersonElement->LinkEndChild(NameElement);
    PersonElement->LinkEndChild(AgeElement);
    NameContent = new TiXmlText("周大福");
     AgeContent = new TiXmlText("23");
    NameElement->LinkEndChild(NameContent);
    AgeElement->LinkEndChild(AgeContent);


    myDocument->SaveFile("info.xml");
    cout << "写入完成 "  << endl << endl;
}


void ReadXmlFile()
{
    //创建一个XML的文档对象。
    TiXmlDocument* myDocument = new TiXmlDocument("info.xml");
    myDocument->LoadFile();
    //获得根元素,即Persons。
    TiXmlElement* RootElement = myDocument->RootElement();
    //输出根元素名称,即输出Persons。
    cout << "根元素标签名:: " << RootElement->Value() << endl;
    //获得第一个Person节点。
    TiXmlElement* FirstPerson = RootElement->FirstChildElement();
    //获得第一个Person的name节点和age节点和ID属性。
    TiXmlElement* NameElement = FirstPerson->FirstChildElement();
    TiXmlElement* AgeElement = NameElement->NextSiblingElement();
    TiXmlAttribute* IDAttribute = FirstPerson->FirstAttribute();
    //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
    cout << "子节点标签名:: " << NameElement->Value() << endl;
    cout << "子节点name:: " << NameElement->FirstChild()->Value() << endl;
    cout << "子节点age:: " << AgeElement->FirstChild()->Value() << endl;
    cout << "子节点ID:: " << IDAttribute->Value() << endl;

}

注意工程中要引入库文件:

运行结果:


总结

其实也就是一层一层节点直接的创建,设置,链接。是个非常简单的结构。

相关推荐
deng-c-f1 小时前
Linux C/C++ 学习日记(53):原子操作(二):实现shared_ptr
开发语言·c++·学习
一个不知名程序员www1 小时前
算法学习入门---结构体和类(C++)
c++·算法
墨雪不会编程2 小时前
C++ string 详解:STL 字符串容器的使用技巧
java·开发语言·c++
yangpipi-3 小时前
《C++并发编程实战》第5章 C++内存模型和原子操作
android·java·c++
SunkingYang3 小时前
MFC进程间消息通信深度解析:SendMessage、PostMessage与SendNotifyMessage的底层实现与实战指南
c++·mfc·共享内存·通信·postmessage·sendmessage·进程间
XFF不秃头4 小时前
力扣刷题笔记-旋转图像
c++·笔记·算法·leetcode
王老师青少年编程4 小时前
csp信奥赛C++标准模板库STL案例应用3
c++·算法·stl·csp·信奥赛·lower_bound·标准模版库
Tim_105 小时前
【C++入门】04、C++浮点型
开发语言·c++
hkNaruto5 小时前
【C++】记录一次C++程序编译缓慢原因分析——滥用stdafx.h公共头文件
开发语言·c++
柏木乃一5 小时前
进程(6)进程切换,Linux中的进程组织,Linux进程调度算法
linux·服务器·c++·算法·架构·操作系统