【C++】开源:tinyxml2解析库配置使用

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍tinyxml2解析库配置使用。
无专精则不能成,无涉猎则不能通。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. 项目介绍
    • :blush:2. 环境配置
    • :satisfied:3. 使用说明
      • 一个解析示例:
      • xml地图解析

😏1. 项目介绍

项目Github地址:https://github.com/leethomason/tinyxml2

TinyXML-2是一个轻量级的C++库,用于解析和生成XML文档。它是对原始TinyXML库的改进和扩展,提供了更快速、更强大的XML处理功能。

以下是一些TinyXML-2的主要特点和功能:

1.简单易用:TinyXML-2提供了简单的API,使得解析和生成XML文档变得简单和直观。它使用类似于DOM(文档对象模型)的方法来操作XML元素,让开发者可以轻松地读取和写入XML数据。

2.轻巧高效:TinyXML-2具有非常小的内存占用和高性能。它专注于简单的XML操作,没有复杂的依赖关系,因此可以快速加载和处理大型XML文件。

3.支持解析和生成:TinyXML-2支持从字符串或文件中解析XML文档,并且可以生成格式良好的XML文本。它能够处理各种节点类型,如元素、属性、文本、注释等。

4.错误处理:TinyXML-2提供了灵活的错误处理机制。当解析XML时,它可以检测到语法错误、结构错误或其他问题,并提供相关的错误信息和异常处理机制。

5.跨平台:TinyXML-2可以在多个操作系统上使用,包括Windows、Linux和Mac OS等。

😊2. 环境配置

下面进行环境配置:

sudo apt-get install build-essential
git clone https://github.com/leethomason/tinyxml2.git
cd tinyxml2
make
sudo make install
# 查看版本
pkg-config --modversion tinyxml2

g++编译:g++ -o main main.cpp -ltinyxml2

😆3. 使用说明

下面进行使用分析:

一个解析示例:

#include <iostream>
#include <tinyxml2.h>int main() {// 创建一个XML文档对象tinyxml2::XMLDocument doc;// 加载XML文件if (doc.LoadFile("example.xml") == tinyxml2::XML_SUCCESS) {// 打印根元素名称tinyxml2::XMLElement* root = doc.FirstChildElement("Root");if (root) {std::cout << "Root Element: " << root->Name() << std::endl;}// 遍历并打印所有子元素tinyxml2::XMLElement* element = root->FirstChildElement();while (element) {std::cout << "Element Name: " << element->Name() << std::endl;// 获取元素的属性值const char* attributeValue = element->Attribute("attribute");if (attributeValue) {std::cout << "Attribute Value: " << attributeValue << std::endl;}// 获取元素的文本内容const char* textValue = element->GetText();if (textValue) {std::cout << "Text Value: " << textValue << std::endl;}element = element->NextSiblingElement();}}// 创建一个新的XML文档tinyxml2::XMLDocument newDoc;// 创建根元素tinyxml2::XMLElement* newRoot = newDoc.NewElement("NewRoot");newDoc.InsertFirstChild(newRoot);// 创建子元素tinyxml2::XMLElement* newElement = newDoc.NewElement("NewElement");newRoot->InsertEndChild(newElement);// 设置属性值newElement->SetAttribute("attribute", "value");// 设置文本内容newElement->SetText("Hello, World!");// 保存XML文件newDoc.SaveFile("new_example.xml");return 0;
}

xml地图解析

项目github地址(推荐学习):https://github.com/chenyongzhe/HdmapEngine

这个地图解析引擎项目用tinyxml2库解析apollo opendrive xml格式的高精地图,包含道路、车道连接关系、信号灯等元素,以及车道搜索、wgs84转东北天等工具,最后可用python matplotlib将处理完的地图show出来。

下面是一些解析示例:

// 读取xml文件,去判断Node
bool HdmapEngine::paserApolloxml(const char *file_name)
{tinyxml2::XMLDocument doc;if (doc.LoadFile(file_name) != XML_SUCCESS)return false;XMLElement *root = doc.RootElement();XMLElement *roadNode = root->FirstChildElement("road"); // find road nodewhile (roadNode != NULL){string name = roadNode->Attribute("name"); // road name// if name include string("Road") or string("junction")if (name.substr(0, 4) == "Road"){// cout << roadNode->Attribute("id") << endl;paserRoad(roadNode);}else if (name.substr(0, 8) == "junction"){paserJunction(roadNode);}roadNode = roadNode->NextSiblingElement();}// 创建搜索树vector<Point> centerLintePoints;for (int i = 0; i < laneList.size(); i++){// if(laneList[i].centerLinePoints!=NULL)for (int j = 0; j < laneList[i]->centerLinePoints.size(); j++){centerLintePoints.push_back(*(laneList[i]->centerLinePoints[j]));}}// cout<<"centerpoint size "<<centerLintePoints.size()<<endl;tree->read_in(centerLintePoints);// cout<<"centerpoint size "<<centerLintePoints.size()<<endl;// cout<<"创建搜索树成功"<<endl;// printRoad();return true;
}
// 解析road元素
bool HdmapEngine::paserRoad(XMLElement *roadNode)
{string predecessor_elementType;int predecessor_id = INT_MAX;int successor_id = INT_MAX;string successor_elementType;double road_length;road_id = atoi(roadNode->Attribute("id"));XMLElement *linkNode = roadNode->FirstChildElement("link");XMLElement *lanes = roadNode->FirstChildElement("lanes");XMLElement *laneSection = lanes->FirstChildElement("laneSection");XMLElement *sucNode = linkNode->FirstChildElement("successor");if (sucNode != NULL){// cout << sucNode->Attribute("elementType") << " " << sucNode->Attribute("elementId") << endl;successor_elementType = sucNode->Attribute("elementType");successor_id = atoi(sucNode->Attribute("elementId"));}XMLElement *preNode = linkNode->FirstChildElement("predecessor");if (preNode != NULL){// cout << preNode->Attribute("elementType") << " " << preNode->Attribute("elementId") << endl;predecessor_elementType = preNode->Attribute("elementType");predecessor_id = atoi(preNode->Attribute("elementId"));}Road *road = new Road(road_id, predecessor_elementType, predecessor_id, successor_elementType, successor_id);int jun = atoi(roadNode->Attribute("junction"));if (jun == -1){// 非路口道路road->isJunctionRoad = false;}else{// 路口道路road->isJunctionRoad = true;}laneSection_id = 0;// lanesectionwhile (laneSection != NULL){paserLaneSection(laneSection, road);laneSection_id++;laneSection = laneSection->NextSiblingElement("laneSection");}// 解析stoplinepaserStopLineCrosswalk(roadNode, road);road->length = road->getRoadLength();roadList.push_back(road);roadMap[road->road_id] = road;return true;
}

gps转xyz工具部分:

bool TransformUtil::gps2xyz(const double &longitude, const double &latitude, const double &altitude,Eigen::Vector3d &xyz)
{// gps << gps_msg.longitude, gps_msg.latitude, gps_msg.altitude;Eigen::Vector3d gps(longitude, latitude, altitude);Eigen::Vector3d gps_ECEF = WGS84toECEF(gps);// 处理GPS数据double rad_lon = gps_origin_[1] / 180 * M_PI;double rad_lat = gps_origin_[0] / 180 * M_PI;double sin_lon = sin(rad_lon);double cos_lon = cos(rad_lon);double sin_lat = sin(rad_lat);double cos_lat = cos(rad_lat);Eigen::Matrix3d rot = Eigen::Matrix3d::Zero();// clang-format offrot << -sin_lon, cos_lon, 0,-sin_lat * cos_lon, -sin_lat * sin_lon, cos_lat,cos_lat * cos_lon, cos_lat * sin_lon, sin_lat;// clang-format onEigen::Vector3d diff_ECEF = gps_ECEF - origin_ECEF_;Eigen::Vector3d xyz_ECEF = rot * diff_ECEF;xyz << xyz_ECEF[0], xyz_ECEF[1], xyz_ECEF[2];return true;
}

在这里插入图片描述

以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/33483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【问题解决】Git命令行常见error及其解决方法

以下是我一段时间没有使用xshell&#xff0c;然后用git命令行遇到的一些系列错误和他们的解决方法 遇到了这个报错&#xff1a; fatal: Not a git repository (or any of the parent directories): .git 我查阅一些博客和资料&#xff0c;可以解决的方式&#xff1a; git in…

Linux单进程、单线程调试命令

l //显示main函数所在的文件的源代码list 文件名:num //显示filename文件num行上下的源代码b 行号 //给指定行添加断点b 函数名 //给指点函数的第一有效行添加一个断点info break //显示断点信息delete 断点号 //删除指定断点disable 断点号 //将断点设定为无效的&#xff0c;不…

冒泡排序 简单选择排序 插入排序 快速排序

bubblesort 两个for循环&#xff0c;从最右端开始一个一个逐渐有序 #include <stdio.h> #include <string.h> #include <stdlib.h>void bubble(int *arr, int len); int main(int argc, char *argv[]) {int arr[] {1, 2, 3, 4, 5, 6, 7};int len sizeof(…

学习Linux,要把握哪些重点?

不知道有没有想学习Linux&#xff0c;但又把握不住学习重点&#xff0c;找不到合适的学习方法的小伙伴&#xff0c;反正我刚开始学习Linux时就像无头苍蝇似的“乱撞”&#xff0c;没有把握住学习重点&#xff0c;不知道怎么去学&#xff0c;差点要放弃了&#xff0c;还好在慢慢…

栈和队列详解(1)

目录 一、什么是栈&#xff1f; 二、创建一个我们自己的栈 1.前置准备 1.1需要的三个文件 1.2结构体的创建和头文件的引用 2.接口的实现 2.1初始化栈结构体 2.2尾插(压栈) 2.3栈存放的元素个数和判断栈是否为空 2.4获取栈顶元素 2.5出栈 2.6摧毁栈 2.7测试接口 三、…

【Freertos基础入门】freertos任务的优先级

文章目录 前言一、任务优先级1.Tick2.修改任务优先级 总结 前言 本系列基于stm32系列单片机来使用freerots 任务管理是实时操作系统&#xff08;RTOS&#xff09;的核心功能之一&#xff0c;它允许开发者以并发的方式组织和管理多个任务。FreeRTOS 是一个流行的开源RTOS&…

数学建模学习(9):模拟退火算法

模拟退火算法(Simulated Annealing, SA)的思想借 鉴于固体的退火原理&#xff0c;当固体的温度很高的时候&#xff0c;内能比 较大&#xff0c;固体的内部粒子处于快速无序运动&#xff0c;当温度慢慢降 低的过程中&#xff0c;固体的内能减小&#xff0c;粒子的慢慢趋于有序&a…

LVS-DR模式集群构建过程演示

一、工作原理 LVS的工作原理 1.当用户向负载均衡调度器&#xff08;Director Server&#xff09;发起请求&#xff0c;调度器将请求发往至内核空间 2.PREROUTING链首先会接收到用户请求&#xff0c;判断目标IP确定是本机IP&#xff0c;将数据包发往INPUT链 3.IPVS是工作在IN…

WPF上位机9——Lambda和Linq

Lambda Linq 操作集合 使用类sql形式查询 Linq To SQL

【maven】常见命令

文章目录 1. 打包编译时跳过测试2.显示maven依赖树3. 显示maven依赖列表4. 下载依赖包的源码5. 安装本地jar到本地仓库 1. 打包编译时跳过测试 mvn clean install -DskipTests mvn clean install -Dmaven.test.skiptrueDskipTests&#xff0c;不执行测试用例&#xff0c;但编译…

Java、Android 之 TCP / IP

TCP、IP是一系列协议组成的网络分层模型 客户端向服务端发送请求可能会走N条链路&#xff0c;这个过程叫路由 TCP传输 一般在1--1024端口 必须连接以后才能传输数据 UDP协议通常只是发送数据 TCP连接 TCP需要建立连接才能通信&#xff0c;建立连接需要端口&#xff0c;Sock…

【Terraform学习】本地变量(Terraform配置语言学习)

背景&#xff1a; 关于如何在机器上拉terraform代码&#xff0c;初始化就不重复了&#xff0c;需要的可以查看前面的文章&#xff1a; 【Terraform学习】Terraform-AWS部署快速入门&#xff08;快速入门&#xff09;_向往风的男子的博客-CSDN博客 使用本地变量命名资源 将每…

centos7安装redis6

centos7安装redis6 https://blog.csdn.net/xiaotiaoza/article/details/130107822 允许访问的地址&#xff0c;默认是127.0.0.1&#xff0c;会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问&#xff0c;生产环境不要设置为0.0.0.0 bind 0.0.0.0 守护进程&#xff0…

jenkins自动化构建保姆级教程(持续更新中)

1.安装 1.1版本说明 访问jenkins官网 https://www.jenkins.io/&#xff0c;进入到首页 点击【Download】按钮进入到jenkins下载界面 左侧显示的是最新的长期支持版本&#xff0c;右侧显示的是最新的可测试版本&#xff08;可能不稳定&#xff09;&#xff0c;建议使用最新的…

竞赛项目 深度学习的口罩佩戴检测 - opencv 卷积神经网络 机器视觉 深度学习

文章目录 0 简介1 课题背景&#x1f6a9; 2 口罩佩戴算法实现2.1 YOLO 模型概览2.2 YOLOv32.3 YOLO 口罩佩戴检测实现数据集 2.4 实现代码2.5 检测效果 3 口罩佩戴检测算法评价指标3.1 准确率&#xff08;Accuracy&#xff09;3.2 精确率(Precision)和召回率(Recall)3.3 平均精…

绕过 open_basedir

目录 0x01 首先了解什么是 open_basedir 0x02 通过命令执行绕过 0x03 通过symlink 绕过 &#xff08;软连接&#xff09; 0x04利用glob://绕过 方式1——DirectoryIteratorglob:// 方式2——opendir()readdir()glob:// 0x05 通过 ini_set和chdir来绕过 在ctfshow 72遇到…

Centos Linux快速复制文件并查看进度的方法(保留文件原始时间戳等属性)

用cp命令保证快速复制&#xff0c;screen保证不丢失你对cp命令执行情况的掌控。 需要用到screen软件包&#xff0c;防止复制过程中终端被关闭。 centos linux直到7默认都没有screen&#xff0c;需要安装一下 普通账户&#xff1a; sudo yum -y install screen root账户&am…

如何在 .NET Core WebApi 中处理 MultipartFormDataContent 中的文件

问题描述# 上图示例展示了用户通过 IOS 客户端发送请求时&#xff0c;对应后端接口接收到的 Request 内容。从请求内容的整体结果&#xff0c;我们可以看出这是一个 multipart/form-data 的数据格式&#xff0c;由于这种数据是由多个 multipart section 组成&#xff0c;所以我…

LVS/DR+Keepalived负载均衡实战(一)

引言 负载均衡这个概念对于一个IT老鸟来说再也熟悉不过了&#xff0c;当听到此概念的第一反应是想到举世闻名的nginx&#xff0c;但殊不知还有一个大名鼎鼎的负载均衡方案可能被忽略了&#xff0c;因为对于一般系统来说&#xff0c;很多应用场合中采用nginx基本已经满足需求&a…

智能优化算法:猎豹优化算法-附代码

智能优化算法&#xff1a;猎豹优化算法 文章目录 智能优化算法&#xff1a;猎豹优化算法1.猎豹优化算法1.1 初始化1.2 搜索策略1.3坐等策略1.4攻击策略 2.实验结果3.参考文献4.Matlab5.python 摘要&#xff1a;CO算法是Mohammad AminAkbari等人于2022年受自然界猎豹狩猎启发而提…