当前位置: 首页 > news >正文

Qt解析XML

背景

本来想解析VS的项目配置文件(*.vcxproj),配合cppclean来发现多余的#incldue

结果发现低估了难度,VS会间接引入许多目录。

略有不甘,暂且作为一个解析XML文件的示例。

代码

VSProjectParser.h

#include <QVector>
#include <memory>class VSProjectParser {
public:VSProjectParser (const QString &vsProjectFilePath);QVector<QString> getIncludeDirectoriesRealPath ();QVector<QString> getCppFilesRealPath ();QVector<QString> getHeadFilesRealPath ();private:class Impl;std::shared_ptr<Impl> m_impl = nullptr;
};

VSProjectParser.cpp

#include "VSProjectParser.h"#include <QDebug>
#include <QDir>
#include <QDomDocument>
#include <QDomElement>
#include <QDomNode>
#include <QFile>
#include <QFileInfo>
#include <QHash>
#include <memory>class Document {
public:Document (const QString &projFilePath);QVector<QString> extractCppFiles ();QVector<QString> extractHeadFiles ();private:void extractTasgInfo ();QHash<QString, QVector<QString>> m_tagsInfo = {};QString m_projFilePath						= "";
};class VSProjectParser::Impl {
public:Impl (const QString &vsProjectFilePath) : m_vsProjectFileInfo (vsProjectFilePath), m_document (vsProjectFilePath){}QFileInfo m_vsProjectFileInfo = "";Document m_document;
};Document::Document (const QString &projFilePath) : m_projFilePath (projFilePath)
{extractTasgInfo();
}QVector<QString>
Document::extractCppFiles()
{QVector<QString> cppTags {"ClCompile"};QVector<QString> ret;for (QString tag : cppTags) {if (m_tagsInfo.contains (tag))ret.append (m_tagsInfo.value (tag));}return ret;
}QVector<QString>
Document::extractHeadFiles()
{QVector<QString> headTags {"ClInclude", "QtMoc"};QVector<QString> ret;for (QString tag : headTags) {if (m_tagsInfo.contains (tag))ret.append (m_tagsInfo.value (tag));}return ret;
}void
Document::extractTasgInfo()
{QFile file (m_projFilePath);if (!file.open (QIODevice::ReadOnly)) {qDebug() << "Failed to open the file.";return;}QDomDocument doc;if (!doc.setContent (&file)) {qDebug() << "Failed to parse the file into a DOM tree.";return;}file.close();QDomElement root = doc.documentElement();QHash<QString, QVector<QString>> tags_with_include_attribute;constexpr auto ATTR_INCLUDE = "Include";QDomNodeList itemGroups = root.elementsByTagName ("ItemGroup");for (int i = 0; i < itemGroups.count(); ++i) {QDomNode itemGroup	  = itemGroups.at (i);QDomNodeList children = itemGroup.childNodes();for (int j = 0; j < children.count(); ++j) {QDomNode child = children.at (j);if (child.isElement()) {QDomElement element = child.toElement();QString tagName		= element.tagName();tags_with_include_attribute[tagName].push_back (element.attribute (ATTR_INCLUDE));}}}QVector<QString> keys;m_tagsInfo = tags_with_include_attribute;
}VSProjectParser::VSProjectParser (const QString &vsProjectFilePath) : m_impl (new Impl (vsProjectFilePath))
{
}QVector<QString>
VSProjectParser::getIncludeDirectoriesRealPath()
{QVector<QString> headers = getHeadFilesRealPath();QVector<QString> ret;for (QString &file : headers) {QFileInfo fileInfo (file);if (!fileInfo.exists()) {qDebug() << __FUNCTION__ << "File not found:" << file;continue;}ret.append (fileInfo.dir().absolutePath());}return ret;
}QVector<QString>
VSProjectParser::getCppFilesRealPath()
{QVector<QString> includes = m_impl->m_document.extractCppFiles();QVector<QString> ret;for (QString &file : includes) {file = m_impl->m_vsProjectFileInfo.dir().absolutePath() + "/" + file;QFileInfo fileInfo (file);if (fileInfo.exists())ret.append (fileInfo.absoluteFilePath());elseqDebug() << __FUNCTION__ << "File not found:" << file;}return ret;
}QVector<QString>
VSProjectParser::getHeadFilesRealPath()
{QVector<QString> includes = m_impl->m_document.extractHeadFiles();QVector<QString> ret;for (QString &file : includes) {file = m_impl->m_vsProjectFileInfo.dir().absolutePath() + "/" + file;QFileInfo fileInfo (file);if (fileInfo.exists())ret.append (fileInfo.absoluteFilePath());elseqDebug() << __FUNCTION__ << "File not found:" << file;}return ret;
}
http://www.lryc.cn/news/423286.html

相关文章:

  • PwnLab: init-文件包含、shell反弹、提权--靶机渗透思路讲解
  • OpenCV—二值化Threshold()、adaptiveThreshold()
  • 第二天:java面向对象编程(OOP)
  • Selenium + Python 自动化测试07(滑块的操作方法)
  • 三防平板满足多样化定制为工业领域打造硬件解决方案
  • pytorch,用lenet5识别cifar10数据集(训练+测试+单张图片识别)
  • Word卡顿的处理方法
  • 在 Linux上常见的10大压缩格式解压命令和它们对应的压缩格式
  • 【数据结构】三、栈和队列:6.链队列、双端队列、队列的应用(树的层次遍历、广度优先BFS、先来先服务FCFS)
  • 技术速递|使用 Native Library Interop 为 .NET MAUI 创建绑定
  • Linux笔记 --- 标准IO
  • 洛谷:B3625 迷宫寻路
  • 【C#】explicit、implicit与operator
  • Vue:Vuex-Store使用指南
  • 对经典动态规划问题【爬台阶】的一些思考
  • 开发一个能打造虚拟带货直播间的工具!
  • 汽车补光照明实验太阳光模拟器光源
  • MediaPipe人体姿态、手指关键点检测
  • 树上dp之换根dp
  • 2024/8/13 英语每日一段
  • Java多线程练习(1)
  • AI高级肖像动画神器LivePortrait
  • Java反射机制深度解析与实践应用
  • Oracle递归查询层级及路径
  • leetcode300. 最长递增子序列,动态规划附状态转移方程
  • C语言:字符串函数strcpy
  • Day16-指针2
  • 数据结构(5.5_3)——并查集的进一步优化
  • (回溯) LeetCode 131. 分割回文串
  • 【Linux】阻塞信号|信号原理|深入理解捕获信号|内核态|用户态|sigaction|可重入函数|volatile|SIGCHILD|万字详解