【目标检测标签转换工具】YOLO 格式与 Pascal VOC XML 格式的互转详解(含完整代码)
一、写在前面:为什么需要标签格式转换?
在目标检测任务中,不同的模型和标注工具使用的标签格式常常不同:
-
YOLO 系列(YOLOv5/v8) 使用的是
.txt
格式,每行为一个目标,记录相对归一化的位置信息; -
Faster R-CNN、SSD、RetinaNet 等 模型常使用 Pascal VOC 格式(
.xml
文件); -
而像 LabelImg、CVAT 等标注工具 默认生成的就是 Pascal VOC 或 COCO 格式。
这就带来了一个常见需求:在模型训练、标注、评估之间自由切换格式,提高数据复用效率!
因此,本文提供 YOLO ↔ Pascal VOC 的双向转换工具代码,并详细说明使用流程、格式说明及代码实现,助你轻松完成数据迁移与模型切换。
二、YOLO 格式与 Pascal VOC 格式简介
YOLO 标签格式(每张图一个 .txt
文件):
每一行一个目标,格式如下:
<class_id> <x_center> <y_center> <width> <height>
其中:
-
class_id
为类别 ID,从 0 开始; -
x_center
,y_center
为目标中心点坐标(相对图像宽高归一化); -
width
,height
也为相对值。
示例:
1 0.521 0.637 0.221 0.340
Pascal VOC 标签格式(每张图一个 .xml
文件):
结构化 XML 文件,包含图像尺寸与每个目标的 <object>
标签,坐标使用的是绝对像素值。
<annotation><folder>VOC2007</folder><filename>example.jpg</filename><size><width>1920</width><height>1080</height><depth>3</depth></size><object><name>Spalling</name><bndbox><xmin>480</xmin><ymin>360</ymin><xmax>920</xmax><ymax>880</ymax></bndbox></object>
</annotation>
⚙️ 三、YOLO ➡ Pascal VOC XML 转换
我们将 YOLO 中的中心点+宽高形式的标注转换为 Pascal VOC 格式的绝对坐标(xmin, ymin, xmax, ymax)。
完整代码如下:
import os
import glob
from PIL import Imagedef convert_yolo_to_voc(yolo_dir, image_dir, output_dir, class_names, img_ext=".jpg"):os.makedirs(output_dir, exist_ok=True)image_list = glob.glob(os.path.join(image_dir, f"*{img_ext}"))print(f"Found {len(image_list)} images.")for idx, image_path in enumerate(image_list):image_name = os.path.splitext(os.path.basename(image_path))[0]label_path = os.path.join(yolo_dir, image_name + ".txt")xml_path = os.path.join(output_dir, image_name + ".xml")# 读取图像尺寸try:image = Image.open(image_path)w, h = image.sizeexcept Exception as e:print(f"Error reading image {image_path}: {e}")continue# 写入 XML 文件头部with open(xml_path, 'w') as xml_file:xml_file.write('<annotation>\n')xml_file.write(f' <folder>VOC2007</folder>\n')xml_file.write(f' <filename>{image_name + img_ext}</filename>\n')xml_file.write(' <size>\n')xml_file.write(f' <width>{w}</width>\n')xml_file.write(f' <height>{h}</height>\n')xml_file.write(' <depth>3</depth>\n')xml_file.write(' </size>\n')if os.path.exists(label_path):with open(label_path, 'r') as f:lines = f.read().splitlines()for line in lines:spt = line.strip().split()if len(spt) != 5:continue # 非标准行跳过class_id = int(spt[0])if class_id >= len(class_names):print(f"Warning: class_id {class_id} out of range in {label_path}")continuename = class_names[class_id]xc, yc, bw, bh = map(float, spt[1:])xmin = int((xc - bw / 2) * w)ymin = int((yc - bh / 2) * h)xmax = int((xc + bw / 2) * w)ymax = int((yc + bh / 2) * h)xml_file.write(' <object>\n')xml_file.write(f' <name>{name}</name>\n')xml_file.write(' <pose>Unspecified</pose>\n')xml_file.write(' <truncated>0</truncated>\n')xml_file.write(' <difficult>0</difficult>\n')xml_file.write(' <bndbox>\n')xml_file.write(f' <xmin>{xmin}</xmin>\n')xml_file.write(f' <ymin>{ymin}</ymin>\n')xml_file.write(f' <xmax>{xmax}</xmax>\n')xml_file.write(f' <ymax>{ymax}</ymax>\n')xml_file.write(' </bndbox>\n')xml_file.write(' </object>\n')xml_file.write('</annotation>\n')if (idx + 1) % 100 == 0:print(f"Processed {idx+1}/{len(image_list)} images.")print("All YOLO labels converted to VOC XML.")# 示例调用:
if __name__ == "__main__":yolo_label_dir = "Rail/test/labels"image_dir = "Rail/test/images"output_xml_dir = "Annotations"class_names = ['Spalling', 'Wheel Burn', 'Squat', 'Corrugation']convert_yolo_to_voc(yolo_label_dir, image_dir, output_xml_dir, class_names)
注意事项:
-
自动读取图像尺寸;
-
支持批量处理;
-
会自动创建 XML 存储目录。
⚙️ 四、Pascal VOC XML ➡ YOLO 转换
本部分代码将 Pascal VOC 格式中的 <bndbox>
绝对坐标转换为 YOLO 所需的相对归一化格式。
完整代码如下:
import os
import glob
import xml.etree.ElementTree as ET
from PIL import Imagedef convert_voc_to_yolo(xml_dir, image_dir, output_dir, class_names, img_ext=".jpg"):os.makedirs(output_dir, exist_ok=True)xml_list = glob.glob(os.path.join(xml_dir, "*.xml"))print(f"Found {len(xml_list)} XML files.")for idx, xml_path in enumerate(xml_list):tree = ET.parse(xml_path)root = tree.getroot()image_name = root.find('filename').textname_base = os.path.splitext(image_name)[0]img_path = os.path.join(image_dir, name_base + img_ext)txt_path = os.path.join(output_dir, name_base + ".txt")# 获取图像宽高try:image = Image.open(img_path)w, h = image.sizeexcept Exception as e:print(f"Error reading image {img_path}: {e}")continuewith open(txt_path, 'w') as f_out:for obj in root.findall('object'):cls_name = obj.find('name').textif cls_name not in class_names:print(f"Warning: class name {cls_name} not in list.")continuecls_id = class_names.index(cls_name)bbox = obj.find('bndbox')xmin = int(float(bbox.find('xmin').text))ymin = int(float(bbox.find('ymin').text))xmax = int(float(bbox.find('xmax').text))ymax = int(float(bbox.find('ymax').text))# 转为YOLO格式:中心点 + 宽高,归一化x_center = (xmin + xmax) / 2.0 / wy_center = (ymin + ymax) / 2.0 / hbox_width = (xmax - xmin) / wbox_height = (ymax - ymin) / hf_out.write(f"{cls_id} {x_center:.6f} {y_center:.6f} {box_width:.6f} {box_height:.6f}\n")if (idx + 1) % 100 == 0:print(f"Processed {idx+1}/{len(xml_list)} annotations.")print(" All VOC XML annotations converted to YOLO format.")# 示例调用:
if __name__ == "__main__":voc_xml_dir = "/Annotations"image_dir = "/test/images"output_yolo_dir = "/test/labels_converted"class_names = ['Spalling', 'Wheel Burn', 'Squat', 'Corrugation']convert_voc_to_yolo(voc_xml_dir, image_dir, output_yolo_dir, class_names)
注意事项:
-
自动读取图像尺寸用于归一化;
-
支持自定义类别名列表;
-
会跳过无效标签或未知类别。
五、实际调用示例(适配你的项目路径)
if __name__ == "__main__":class_names = ['Spalling', 'Wheel Burn', 'Squat', 'Corrugation']# YOLO → XMLconvert_yolo_to_voc(yolo_dir="Rail/test/labels",image_dir="Rail/test/images",output_dir="Annotations",class_names=class_names)# XML → YOLOconvert_voc_to_yolo(xml_dir="Annotations",image_dir="Rail/test/images",output_dir="Rail/test/labels_converted",class_names=class_names)
六、总结
通过本文,你可以轻松实现:
-
YOLO 格式转 VOC XML,用于模型评估或可视化工具(如 LabelImg);
-
Pascal VOC XML 转 YOLO 格式,用于 YOLO 系列训练和部署;
-
批量处理、自定义类别、路径自动化,适配多种检测任务。
数据预处理的质量,直接决定模型训练的效果,掌握格式转换是深度学习项目中必不可少的基本功!
相关文章:
【目标检测标签转换工具】YOLO 格式与 Pascal VOC XML 格式的互转详解(含完整代码)
一、写在前面:为什么需要标签格式转换? 在目标检测任务中,不同的模型和标注工具使用的标签格式常常不同: YOLO 系列(YOLOv5/v8) 使用的是 .txt 格式,每行为一个目标,记录相对归一化…...
Redis最新入门教程
文章目录 Redis最新入门教程1.安装Redis2.连接Redis3.Redis环境变量配置4.入门Redis4.1 Redis的数据结构4.2 Redis的Key4.3 Redis-String4.4 Redis-Hash4.5 Redis-List4.6 Redis-Set4.7 Redis-Zset 5.在Java中使用Redis6.缓存雪崩、击穿、穿透6.1 缓存雪崩6.2 缓冲击穿6.3 缓冲…...
2025年渗透测试面试题总结-某步在线面试(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 一、操作系统相关问题总结与分析及扩展回答 1. Linux命令熟悉度 2. 查看进程的命令 3. 查看网络进程…...
网络化:DevOps 工程的必要基础(Networking: The Essential Foundation for DevOps Engineering)
李升伟 编译 理解网络化基础知识 你是否曾想过是什么真正让卓越的DevOps工程师与众人区别开来?答案是网络化。是的,对网络的基本理解不仅仅是有帮助的——它是绝对必要的。在当今以微服务、容器和分布式系统为主宰的互联互通世界中,对网络原…...
<template>标签的用法
一、原生的template标签的用法 <template> 是 HTML5 引入的一个标签,用于声明 HTML 片段,这些片段在页面加载时不会被渲染,但可以在运行时通过 JavaScript 实例化和使用。 基本用法 <template id"myTemplate"> <…...
【数据结构】——链表OJ(下)
前面我们已经刷了几道单链表的题目,下面我们继续看几道题目。 一、相交链表 这道题题目的要求是很好理解的,就是现在我们有两个链表,然后我们就相办法进行判断,这两个链表是否是相交的,那么链表的相交其实就是有没有共…...
笔试专题(十六)
文章目录 相差不超过k的最多数题解代码 最长公共子序列(一)题解代码 小红的口罩题解代码 春游题解代码 相差不超过k的最多数 题目链接 题解 1. 排序 滑动窗口 2. 为什么使用滑动窗口? 因为max-min < k,求这个区间内的数最…...
云原生应用全生命周期管理实战:从开发、部署到运维的一体化方案
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、前言:应用交付正在被“云原生”重塑 随着企业IT架构从单体转向微服务,再到全面拥抱容器化与Kubernetes,应用的构建、部署、配置、监控、弹性与治理也正经历一场全方位的变革。传统的开发运维…...
图表制作-带背景色的柱状图
首先登录自己的账号,没有账号的可以注册一个。 登录之后,在左侧菜单栏找到图表制作-统计图。 点击新建统计图,点击柱状图-带背景色的柱状图。 初始会有一些演示数据,可以根据自己的需要进行修改。 如果觉得手动修改太麻烦…...
【Pandas】pandas DataFrame ewm
Pandas2.2 DataFrame Function application, GroupBy & window 方法描述DataFrame.apply(func[, axis, raw, …])用于沿 DataFrame 的轴(行或列)应用一个函数DataFrame.map(func[, na_action])用于对 DataFrame 的每个元素应用一个函数DataFrame.a…...
V 型球阀:多材质多驱动,精准适配复杂严苛工况-耀圣
V 型球阀:多材质多驱动,精准适配复杂严苛工况 在化工、矿业、环保等工业领域,带颗粒介质、料浆以及高腐蚀性介质的输送与控制一直是行业难题。普通阀门在这些复杂工况下,易出现磨损、腐蚀、控制失灵等问题,而 V 型球阀…...
使用C# ASP.NET创建一个可以由服务端推送信息至客户端的WEB应用(2)
接上文 使用C# ASP.NET创建一个可以由服务端推送信息至客户端的WEB应用(1) https://blog.csdn.net/coldwind811201/article/details/147607641 1. 更新NuGet包 升级NuGet包后,注意相应修改前面页面上的JS引用为相应新版本的jquery JS脚本 …...
Java响应实体【R】
R响应实体 响应实体R(Response Entity)具体作用说明?1、用与数据传输2、用于状态反馈3、指令与控制 普通响应实体优化后的R:高级响应实体类 响应实体R(Response Entity)具体作用说明? 1、用与数据传输 传输请求结果 :当客户端向…...
短视频矩阵系统批量剪辑模式开发详解,支持OEM
在短视频行业竞争激烈的当下,短视频矩阵系统通过批量剪辑功能实现高效内容生产,成为众多运营者的利器。本文将深入探讨短视频矩阵系统中几种常见批量剪辑模式的开发思路与实现方法,助力开发者构建功能强大的批量剪辑模块。 一、批量剪辑模式概…...
顺丰科技:从 Presto 到 Doris 湖仓构架升级,提速 3 倍,降本 48%
导读:顺丰科技引入 Doris 替换 Presto,在内部可视化数据自助分析工具丰景台场景广泛应用。目前,顺丰临时查询业务、丰景台报表业务的 Presto 场景已经 100% 切换到 Doris 集群中,日均查询量 100W。并实现 P95 性能提升近 3 倍&…...
使用 Cesium 构建 3D 地图应用的实践
CesiumJS 是一个功能强大的开源 JavaScript 库,能够帮助开发者快速构建高性能、高精度的 3D 地球和地图应用 。本文将介绍如何使用 Cesium 构建一个基本的 3D 地图应用,并加载自定义的 3D Tiles 模型。 初始化 Cesium Viewer 首先,在 Vue 的…...
公链钱包开发:技术逻辑与产品设计实践
公链钱包开发:技术逻辑与产品设计实践 ——2025年数字资产管理的范式革命与用户价值重构 一、公链钱包的核心理解:技术逻辑与用户价值的耦合 公链钱包不仅是存储数字资产的工具,更是用户与区块链生态交互的“超级入口”。其核心价值体现在三…...
mobile自动化测试-appium webdriverio
WebdriverIO是一款支持mobile app和mobile web自动化测试框架,与appium集成,完成对mobile应用测试。支持ios 和android两种平台,且功能丰富,是mobile app自动化测试首选框架。且官方还提供了mobile 应用测试example代码࿰…...
【Python开源】深度解析:一款高效音频封面批量删除工具的设计与实现
🎵 【Python开源】深度解析:一款高效音频封面批量删除工具的设计与实现 🌈 个人主页:创客白泽 - CSDN博客 🔥 系列专栏:🐍《Python开源项目实战》 💡 热爱不止于代码,热情…...
飞算 用到妙处 AI辅助编程 - 双击方法名,自动识别到上下文中很方便
1. 双击findtasktypedict方法。右侧箭头指向自动识别 2. 按照说的内容机型了修改...
msIT大模型推理迁移调优工具
msIT LLM大模型ATB推理精度工具 适用场景:大模型加速库推理精度分析工具能力:大模型推理精度工具msIT llm,提供基于加速库推理的精度调试工具,支持数据dump、精度比对、单算子预检、溢出检测、模型迁移等能力。 msIT LLM大模型…...
YOGA Air X ILL10(83CX)/YOGA 14 ILL10X(83LC)2025款恢复开箱状态原装出厂Win11系统OEM镜像
适用机型(MTM): 【83LC】链接:https://pan.baidu.com/s/1AwbFR9nccvyzS1pOCToMvA?pwdewjs 提取码:ewjs 【83CX】链接:https://pan.baidu.com/s/1wMRI8ETodVG59GBDVDLgQg?pwdn3nx 提取码:n3nx lenovo联想原装wi…...
使用Deployment部署运行Nginx和Apache服务
1.Deployment简介 : 在Kubernetes(k8s)中,Deployment 是一种核心控制器资源,用于管理无状态应用的声明式部署、扩展与更新。它通过定义应用的期望状态,由控制器自动维护实际状态与期望状态的一致性&#x…...
382_C++_在用户会话结束时,检查是否有其他会话仍然来自同一个客户端 IP 地址,没有连接状态设置为断开,否则为连接
之前出现的问题:重启管理机,工作机上面热备连接状态显示未连接 (此时是有一个工作机连接管理机的),所以正常应该是连接状态解决:根因分析: 重启管理机后,管理机给过来的cookie是空的,导致工作机同时存在两个管理机的session,在其中一个超时后,调用回调函数通知会话断开…...
【 Redis | 实战篇 短信登录 】
前言: 主要完成了基于Session实现登录,解决集群的Session共享问题,从而实现了基于Redis来实现共享Session登录 1.基于Session实现登录 1.1.发送短信验证码 步骤: 前端提交手机号 》校验手机号 》不符合返回错误信息࿰…...
AI(学习笔记第二课) 使用langchain进行AI开发
文章目录 AI(学习笔记第二课) 使用langchain进行AI开发学习内容:1. 使用背景2.创建python(pycharm community版)开发环境并连接deepseek2.1 创建python(pycharm community版)开发环境2.2 创建python工程2.3 写入初始py…...
如何查看某个文件中的特殊符号
Q:如何查看某个文件中的特殊符号,比如说是换行符之类的转义字符? 1,法1:使用cat -A cat -A filename可以看到-A本质上就是-vET,也就是 展示所有的字符,-v是显示非打印字符,这个需…...
venv环境里控制scapy版本和起trex v2.87
要在虚拟环境(venv)中控制Scapy版本并运行TRex v2.87,您可以按照以下步骤操作: 创建一个新的虚拟环境: python3 -m venv trex-env激活创建的虚拟环境。在Linux或macOS上: source trex-env/bin/activate在Wi…...
第五十四篇 AI与数据分析
一、AI数据分析就像做菜 想象你在厨房做一道新菜,AI数据分析的流程其实非常相似: 买菜(获取数据) 去市场挑选新鲜蔬菜 从Excel/数据库获取数据例:pd.read_csv(超市销售表.csv) 洗菜切菜(清洗数据&#x…...
C++面向对象编程入门:从类与对象说起(一)
C语言是面向过程,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题,而C面向的是对象,关注的是对象,将一件事拆解成多个对象,靠对象之间互交完成。 目录 类的定义 类的两种定义 …...
openwrt之UCI 增删改查(add/get/set /add_list...)
1,引入 UCI是openwrt的统一配置接口,所有的配置文件被存放在/etc/config/下,使用UCI工具操作具体可查询官网中的开发文章: [OpenWrt Wiki] The UCI systemhttps://openwrt.org/docs/guide-user/base-system/uciconifg <secti…...
TypeScript 中,属性修饰符
在 TypeScript 中,属性修饰符(Property Modifiers)是用于修饰类的属性或方法的关键字,它们可以改变属性或方法的行为和访问权限。TypeScript 提供了三种主要的属性修饰符:public、private 和 protected。此外ÿ…...
LeetCode 3341.到达最后一个房间的最少时间 I:Dijkstra算法(类似深搜)-简短清晰的话描述
【LetMeFly】3341.到达最后一个房间的最少时间 I:Dijkstra算法(类似深搜)-简短清晰的话描述 力扣题目链接:https://leetcode.cn/problems/find-minimum-time-to-reach-last-room-i/ 有一个地窖,地窖中有 n x m 个房间…...
http重新为https
1.先创建一个配置文件 主要方便实验 可以将主配置文件下的location全部注释掉,方便观察 2.配置新配置文件 server{ listen 80; listen 443 ssl; ssl_certificate /usr/local/nginx/conf.d/ssl/www.kgc.com.crt; ssl_certificate_key /usr/local/nginx/conf…...
2025最新免费视频号下载工具!支持Win/Mac,一键解析原画质+封面
软件介绍 适用于Windows 2025 最新5月蝴蝶视频号下载工具,免费使用,无广告且免费,支持对原视频和封面进行解析下载,亲测可用,现在很多工具都失效了,难得的几款下载视频号工具,大家且用且珍…...
CTF杂项入门(BUUCTF-Misc第一页)
写在前面 题目涵盖:BUUCTF 第一页杂项 涉及工具: 随波逐流、foremost、binwalk、honeyview、010editor、zipperello、archpr、wireshark、cyberchef、QR_Research、PNGCRC爆破、stegsolve、Audacity、河马、D盾、routerpassview、steghide,以…...
碰一碰发视频一键成片功能开发实践与技术解析
在数字化营销与内容传播领域,碰一碰发视频技术凭借便捷的交互体验,已成为实体商业引流的重要手段。而一键成片功能的融入,能够让用户在触碰 NFC 标签后,快速获取高质量的视频内容,进一步提升传播效率。本文将从功能需求…...
【CTFer成长之路】举足轻重的信息搜集
举足轻重的信息搜集 信息搜集 常见的搜集 题目描述: 一共3部分flag docker-compose.yml version: 3.2services:web:image: registry.cn-hangzhou.aliyuncs.com/n1book/web-information-backk:latestports:- 80:80启动方式 docker-compose up -d 题目Flag n1book{info_…...
centos搭建dokcer和vulhub
1、换源阿里云 2、安装docker与docker-compose 下载1.29.2 docker compose sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 如果下载不了,可以…...
Linux系统下使用Kafka和Zookeeper
Apache Kafka 是一个分布式流处理平台,最初由 LinkedIn 开发,后来成为 Apache 软件基金会的顶级项目。它具有高吞吐量、可扩展性、持久性、容错性等特点,主要用于处理实时数据流。 Linux系统下使用Kafka 1.安装 Java Kafka 和 Zookeeper 都是基于 Java 开发的,所以需要先…...
vscode与keil的乱码不兼容问题
都用英文注释 中文注释的话,打开vscode的自动识别格式,如下 解决VSCode中文乱码 自动识别也可以设置识别优先级,把GB2312和UTF8排在自动识别序列前面(因为keil默认就是GB2312) 4.!!!在暂存更改的时候,不要把vscode的设置给暂存了ÿ…...
C++类和对象:构造函数、析构函数、拷贝构造函数
引言 介绍:C类和对象:构造函数、析构函数、拷贝构造函数 _涂色_博主主页 C基础专栏 一、类的默认成员函数 先认识一下类中的默认成员函数: 默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。⼀个类…...
【FAQ】HarmonyOS SDK 闭源开放能力 — PDF Kit
1.问题描述: 预览PDF文件,文档上所描述的loadDocument接口,可以返回文件的状态,并无法实现PDF的预览,是否有能预览PDF相关接口? 解决方案: 1、执行loadDocument进行加载PDF文件后,…...
Spring Boot 3 + Undertow 服务器优化配置
优化背景 当你的application需要支持瞬时高并发的时候,tomcat已经不在是最优的选择,我们可以改为Undertow,并对其进行优化。 Undertow 是一个轻量级的、高性能的Java Web 服务器,由JBoss 开发并开源。它是基于非阻塞(…...
网易游戏 Flink 云原生实践
摘要:本文整理自网易游戏实时计算&数据湖平台负责人林小铂老师和网易游戏大数据开发工程师陈宇智老师,在Flink Forward Asia 2024 云原生专场的分享。主要分为四个部分: 1、背景 2、架构演进 3、实践挑战 4、总结和展望 01.背景 Flink 在…...
使用迁移学习的自动驾驶汽车信息物理系统安全策略
信息物理系统 (CPS) 是一种新兴系统,它通过信息通信基础设施,实现控制系统、传感器、执行器和周围环境等物理组件之间有效的实时通信与协作 (C&C)。自动驾驶汽车 (AV) 是大量采用 CPS 方法的领域之一,旨在通过降低能源消耗和空气污染来改善智慧城市中的人们生活。因此,…...
《算法导论(第4版)》阅读笔记:p11-p13
《算法导论(第4版)》学习第 8 天,p11-p13 总结,总计 3 页。 一、技术总结 无。 二、英语总结(生词:2) 1.precious (1)precious: pretium(“value, worth, price”) adj. of great value(宝贵,珍贵)。 (2)示例 Computing t…...
Qt 编译 sqldrivers之psql
编译postgres pgsql驱动 下载驱动源码修改配置文件编译 下载驱动源码 // 源代码下载 https://download.qt.io/archive/qt/5.15/5.15.2/submodules/驱动目录:qtbase-everywhere-src-5.15.2\src\plugins\sqldrivers 修改配置文件 打开pro文件 右键点击添加库 此处的为debu…...
查看单元测试覆盖率
文章目录 1、POM文件配置2、编写单元测试3、执行单元测试4、查看单元测试覆盖率 1、POM文件配置 pom文件配置jacoco插件 <!-- 生成JaCoCo覆盖率数据插件 --> <plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artif…...
ASP.NET Core 中实现 Markdown 渲染中间件
文章目录 前言一、核心功能二、实现步骤1)安装依赖包2)创建中间件类3)中间件扩展方法4)在Program.cs配置5)模板文件示例6)*.md文件示例7)缓存优化8)使用示例 三、注意事项总结 前言 …...