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

Posted 方游天下

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++解析XML(Win10-x64+VS2015)相关的知识,希望对你有一定的参考价值。

C++解析XML

    • 简介

    • TinyXML包含的对象及方法

    • 使用步骤


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文件夹,里面包含如下文件:

编译静态链接库

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

将静态链接库tinyxml.lib和头文件tinystr.h,tinyxml.h独立出来成文件夹,如下:将头文件放入include文件夹,将库文件放入lib文件夹。
C++解析XML(Win10-x64+VS2015)
第二步,配置开发环境

1.建立tinyxml专用属性表

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

  • C/C+±>常规->附加包含目录:添加include目录

  • 链接器->常规->附加库目录:添加lib目录

  • 链接器->输入->附加依赖项:添加 tinyxml.lib

2.导入tinyxml属性表

在属性管理器窗口,打开平台对应的配置文件夹:Debug|x64,右键添加现有属性表,将刚才设置好的属性表UseTinyXml.props导入即可。
C++解析XML(Win10-x64+VS2015)

第三步,读取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


以上是关于C++解析XML(Win10-x64+VS2015)的主要内容,如果未能解决你的问题,请参考以下文章

为啥我无法在 win64 上使用 boost 1.54 编译 VS2012 C++ 代码?

Matlab2016a使用vs2017编译C++文件报错mexfilerequiredapiversion解决方案

win10--vs2015--libjpeg--64位库的编译过程记录

Win7 64位 VS2015环境编译Libpng

OpenCV3.0.0+win10 64位+vs2015环境的下载,安装,配置

Win7 64位 VS2015环境编译cegui-0.8.5