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

这篇具有很好参考价值的文章主要介绍了【C++】开源:tinyxml2解析库配置使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

😏1. 项目介绍

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

以下是一些tinyxml2的主要特点和功能:

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. 环境配置

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

# apt安装
sudo apt install libtinyxml2-dev
# 源码编译
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. 使用说明

写入xml文件示例

#include <iostream>
#include "tinyxml2.h"

int main() {
    // 创建XML文档
    tinyxml2::XMLDocument doc;

    // 创建根元素
    tinyxml2::XMLElement* root = doc.NewElement("Data");
    doc.InsertFirstChild(root);

    // 添加数字
    tinyxml2::XMLElement* numberElement = doc.NewElement("Number");
    numberElement->SetText(42);
    root->InsertEndChild(numberElement);

    // 添加字符串
    tinyxml2::XMLElement* stringElement = doc.NewElement("String");
    stringElement->SetText("Hello, world!");
    root->InsertEndChild(stringElement);

    // 添加数组
    tinyxml2::XMLElement* arrayElement = doc.NewElement("Array");
    int arrayData[] = {1, 2, 3, 4, 5};
    for (int i = 0; i < 5; i++) {
        tinyxml2::XMLElement* item = doc.NewElement("Item");
        item->SetText(arrayData[i]);
        arrayElement->InsertEndChild(item);
    }
    root->InsertEndChild(arrayElement);

    // 保存XML文档到文件
    doc.SaveFile("data/data.xml");

    std::cout << "XML file created successfully." << std::endl;

    return 0;
}

读取xml文件示例

#include <iostream>
#include "tinyxml2.h"

int main() {
    // 加载XML文件
    tinyxml2::XMLDocument doc;
    if (doc.LoadFile("data/data.xml") != tinyxml2::XML_SUCCESS) {
        std::cout << "Failed to load the file." << std::endl;
        return 1;
    }

    // 获取根元素
    tinyxml2::XMLElement* root = doc.FirstChildElement("Data");
    if (!root) {
        std::cout << "Failed to find the root element." << std::endl;
        return 1;
    }

    // 读取数字
    int number;
    if (auto numberElement = root->FirstChildElement("Number")) {
        numberElement->QueryIntText(&number);
        std::cout << "Number: " << number << std::endl;
    } else {
        std::cout << "Failed to find the Number element." << std::endl;
    }

    // 读取字符串
    if (auto stringElement = root->FirstChildElement("String")) {
        const char* stringValue = stringElement->GetText();
        if (stringValue) {
            std::cout << "String: " << stringValue << std::endl;
        } else {
            std::cout << "Failed to get the String value." << std::endl;
        }
    } else {
        std::cout << "Failed to find the String element." << std::endl;
    }

    // 读取数组
    if (auto arrayElement = root->FirstChildElement("Array")) {
        for (auto item = arrayElement->FirstChildElement("Item"); item; item = item->NextSiblingElement("Item")) {
            int value;
            item->QueryIntText(&value);
            std::cout << "Array Item: " << value << std::endl;
        }
    } else {
        std::cout << "Failed to find the Array element." << std::endl;
    }

    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 node

  while (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;
   // lanesection
   while (laneSection != NULL)
   {
      paserLaneSection(laneSection, road);
      laneSection_id++;
      laneSection = laneSection->NextSiblingElement("laneSection");
   }

   // 解析stopline
   paserStopLineCrosswalk(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 off
  rot << -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 on

  Eigen::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;
}

【C++】开源:tinyxml2解析库配置使用,# c++开源项目学习,c++,开源,开发语言

以上。文章来源地址https://www.toymoban.com/news/detail-634984.html

到了这里,关于【C++】开源:tinyxml2解析库配置使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】开源:CGAL计算几何库配置使用

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍CGAL计算几何库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 项目Github地址: https://github.com/CGAL/cgal CGAL(Computational G

    2024年02月13日
    浏览(39)
  • 【C++】开源:Muduo网络库配置与使用

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍Muduo网络库配置与使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 项目Github地址: https://github.com/chenshuo/muduo Muduo 是一个基于

    2024年02月15日
    浏览(36)
  • 【C++】开源:Boost库常用组件配置使用

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍Boost库常用组件配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 项目Github地址: https://github.com/boostorg/boost Boost库在线书籍

    2024年02月15日
    浏览(56)
  • 使用TinyXML-2解析XML文件

    当我们想要在不同的程序、系统或平台之间共享信息时,就需要一种统一的方式来组织和表示数据。XML(EXtensible Markup Language,即可扩展标记语言)是一种用于描述数据的标记语言,它让数据以一种结构化的方式呈现,使得计算机程序能够轻松理解和处理这些数据。 XML有以下

    2024年02月20日
    浏览(43)
  • 【C++】开源:Redis数据库配置与使用

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍Redis数据库配置与使用。 无专精则不能成,无涉猎则不能通。。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 项目Github地址: https://github.com/redis/redis Redis(Remote Dict

    2024年02月15日
    浏览(43)
  • 【C++】开源:Boost网络库Asio配置使用

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍Asio网络库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 项目Github地址: https://github.com/boostorg/asio Boost.Asio 是一个用于

    2024年02月15日
    浏览(48)
  • 【C++】开源:MQTT安装与配置使用(mosquitto)

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍MQTT安装与配置使用。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习知识,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 官网: https://mqtt.org/ MQTT 是一个基于 客户端-服务器 的 消息发布/订阅传

    2024年02月04日
    浏览(50)
  • 【C++】开源:事件驱动网络库libevent配置使用

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍事件驱动库libevent配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 项目Github地址: https://github.com/libevent/libevent 官网:

    2024年02月14日
    浏览(44)
  • 【C++】开源:spdlog跨平台日志库配置使用

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍spdlog日志库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 项目Github地址: https://github.com/gabime/spdlog Spdlog 是一个高性能

    2024年02月13日
    浏览(59)
  • 【C++】开源:sqlite3数据库配置使用

    😏 ★,° :.☆( ̄▽ ̄)/$: .°★ 😏 这篇文章主要介绍sqlite3数据库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 项目Github地址: https://github.com/sqlite/sqlite SQLite 是一种嵌入式

    2024年02月14日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包