C++使用TinyXML解析XML

C++解析XML(Win10-x64+VS2015)

简介

​ 使用开源库TinyXML解析XML文件,TinyXML能够在windows或linux中编译,使用TinyXML只需要将其中的6个文件拷贝到项目中就可以直接使用了,这六个文件是:tinyxml.h、tinystr.h、tinyxml.cpp、tinystr.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp。

TinyXML包含的对象及方法

1.对象

在TinyXML中,根据XML的各种元素来定义了一些类:

TiXmlBase:整个TinyXML模型的基类。

TiXmlAttribute:对应于XML中的元素的属性。

TiXmlNode:对应于DOM结构中的节点。

TiXmlComment:对应于XML中的注释

TiXmlDeclaration:对应于XML中的申明部分,即<?versiong=“1.0” ?>。

TiXmlDocument:对应于XML的整个文档。

TiXmlElement:对应于XML的元素。

TiXmlText:对应于XML的文字部分

TiXmlUnknown:对应于XML的未知部分。

TiXmlHandler:定义了针对XML的一些操作。

根据下图来说明常用的类对应的文本格式:

<?xml version="1.0" ?> //TiXmlDeclaration,声明
<MyApp>    //TiXmlElement,元素
    <!-- Settings for MyApp -->//TiXmlComment,注释
    <Messages>//TiXmlElement,元素
        <Welcome>Welcome to MyApp</Welcome>
//<Welcome>是元素TiXmlElement ,“Welcome to MyApp”是TiXmlText,文本
        <Farewell>Thank you for using MyApp</Farewell>//同上
    </Messages>
    <Windows>//TiXmlElement,元素
        <Window name="MainFrame" x="5" y="15" w="400" h="250" />
// Window是元素TiXmlElement ,name、x、y、h是TiXmlAttribute
    </Windows>
    <Connection ip="192.168.0.1" timeout="123.456000" />
</MyApp>

Element(元素)是Node(节点)的扩展,用Element可以方便的获得Node的属性:getAttribute(attrname),如果用Node的话,得到的是一个属性集,还要进一步检索。Element是Node的子集,例如在<Welcome priority="1">Welcome to MyApp</Welcome>中,Welcome是元素节点,priority是属性节点,Welcome to MyApp是文本节点

2.方法

读取xml文件

bool TiXmlDocument::LoadFile(const char*filename)

加载成功返回true,加载失败返回false

TiXmlDocument doc;
doc.LoadFile("test.xml");

从文档对象中获取xml的第一个子元素

TiXmlElement* root = doc.FirstChildElement();

如果没有子元素,则返回空指针;否则,返回指向第一个子元素的指针

从指向文档子元素root的指针中获取子元素

TiXmlElement* elementL1 = root->FirstChildElement();

如果没有子元素,则返回空指针;否则,返回指向第一个子元素的指针

FirstChildElement()是重载函数,也可以如下使用:

TiXmlElement* elementL1 = root->FirstChildElement("Welcome");

这样获取的就是第一个名为Welcome的子元素

获取元素的名,属性,文本

例如<Welcome priority="1">Welcome to MyApp</Welcome>

元素的名为Welcome,属性priority值为"1",文本的值为Welcome to MyApp

std::string elemName = elementL1->Value();
std::string elemAttr = elementL1->Attribute("priority"); // 获取prioriy属性值
TiXmlNode* elementL2 = elementL1->FirstChild();  // 获取Dom结构节点
// elementL2->ToText() 返回节点对应的文本对象
std::string elemText = elementL2->ToText()->Value(); // 返回文本值

使用步骤

第一步,下载并编译TinyXML

下载TinyXML,下载地址: http://www.grinninglizard.com/tinyxml/

下载完成后解压会得到一个tinyxml文件夹,里面包含如下文件:
在这里插入图片描述

编译静态链接库

使用VS2015打开tinyxml.sln,将平台配置修改为Debug/X64,在解决方案资源管理器中,包含4个项目,右键解决方案下的tinyxml项目,单独生成,成功后会在x64/Debug文件夹下生成tinyxml.lib(64位下的lib)
在这里插入图片描述
在这里插入图片描述
打包静态链接库文件

将静态链接库tinyxml.lib和头文件tinystr.h,tinyxml.h独立出来成文件夹,如下:将头文件放入include文件夹,将库文件放入lib文件夹。
在这里插入图片描述
第二步,配置开发环境

1.建立tinyxml专用属性表

打开VS2015,新建一个C++控制台应用程序。点击窗口打开属性管理器窗口,新建一个属性表,命名为UseTinyXml.props,保存路径选择前一步新建的静态链接库文件夹。并按如下方式设置:

  • C/C+±>常规->附加包含目录:添加include目录
  • 链接器->常规->附加库目录:添加lib目录
  • 链接器->输入->附加依赖项:添加 tinyxml.lib

2.导入tinyxml属性表

在属性管理器窗口,打开平台对应的配置文件夹:Debug|x64,右键添加现有属性表,将刚才设置好的属性表UseTinyXml.props导入即可。
在这里插入图片描述

第三步,读取XML文件

TinyXML的使用方法参考文章末尾链接。

如下,准备了一个XML文件
在这里插入图片描述

读取xml的代码如下:

//*****************************************************************************
// 功能:使用TinyXml解析xml
// 时间:2020.11.17
// 语言版本:C++11
// 依赖:tinyxml-版本2_6_2
// 版本:Version1.0.1
//*****************************************************************************

#include "stdafx.h"
#include "tinyxml.h"
#include <iostream>
#include <string>

int main()
{
  char*xmlname = "E:\\DataSet\\IMG_20201116_112651.xml";
  TiXmlDocument doc;
  if (!doc.LoadFile(xmlname))
    std::cerr << doc.ErrorDesc() << std::endl;
  else
    std::cout << "xml加载成功...!" << std::endl;
  TiXmlElement* root = doc.FirstChildElement();
  if (root == NULL)
    std::cerr << "Failed to load file: No root element." << std::endl;
  TiXmlElement* elementL1 = root->FirstChildElement();
  std::string path = root->FirstChildElement("path")->GetText();
  std::cout << path << std::endl;
  for(TiXmlElement* elemobj = root->FirstChildElement("object"); 
      elemobj != NULL; elemobj = elemobj->NextSiblingElement("object")) {
    const char* elemName = "code";
    int equalZero = strcmp(elemobj->FirstChildElement("name")->GetText(), elemName);
    if (equalZero == 0) {
      TiXmlElement* elembndbox = elemobj->FirstChildElement("bndbox");
      int xmin = atoi(elembndbox->FirstChildElement("xmin")->GetText());
      int ymin = atoi(elembndbox->FirstChildElement("ymin")->GetText());
      int xmax = atoi(elembndbox->FirstChildElement("xmax")->GetText());
      int ymax = atoi(elembndbox->FirstChildElement("ymax")->GetText());
      std::cout << "xmin :  " << xmin << std::endl;
      std::cout << "ymin :  " << ymin << std::endl;
      std::cout << "xmax :  " << xmax << std::endl;
      std::cout << "ymax :  " << ymax << std::endl;
    }
  }
  doc.Clear();
  system("pause");
  return 0;
}

输出如下:
在这里插入图片描述

参考:
https://www.cnblogs.com/hgwang/p/5833638.html
https://blog.csdn.net/lvmengzou/article/details/90380068

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值