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

xml格式化(1):使用python的xml库实现自闭合标签

前言

最近一段时间一直想要写一个urdf格式化插件。

至于为什么嘛,因为使用sw2urdf插件,导出的urdf,同一标签的内容,是跨行的,这就导致,内容比较乱,而且行数比较多。影响阅读。

因此,自己想写格式化的脚本。

最近就开始分享一些,之前的思考。

正文

import xml.etree.ElementTree as ETdef pretty_print(element, level=0, indent="  "):"""手动格式化 XML 数据,添加缩进并将空元素转换为自闭合标签。:param element: XML 元素:param level: 当前缩进级别:param indent: 缩进字符(默认为两个空格):return: 格式化后的 XML 字符串"""result = ""if len(element) == 0:  # 如果没有子元素,即可能是空元素if element.text and element.text.strip():  # 如果有文本内容result += f"{indent * level}<{element.tag}>{element.text.strip()}</{element.tag}>\n"else:result += f"{indent * level}<{element.tag} "# 如果有属性,添加到标签中if element.attrib:result += " ".join([f'{key}="{value}"' for key, value in element.attrib.items()])result += " />\n"  # 使用自闭合标签形式else:result += f"{indent * level}<{element.tag}"# 如果有属性,添加到标签中if element.attrib:result += " " + " ".join([f'{key}="{value}"' for key, value in element.attrib.items()])result += ">\n"# 处理元素的文本内容if element.text and element.text.strip():result += f"{indent * (level + 1)}{element.text.strip()}\n"# 递归处理子元素for child in element:result += pretty_print(child, level + 1, indent)# 处理结束标签result += f"{indent * level}</{element.tag}>\n"return result# 读取 XML 文件
file_path = 'test.urdf'  # 请将此路径替换为实际的文件路径
tree = ET.parse(file_path)
root = tree.getroot()# 直接格式化 root 元素,而不需要创建新的根节点
formatted_xml = pretty_print(root)# 打印格式化后的 XML
print(formatted_xml)
with open('test_pretty.urdf', 'w') as f:f.write(formatted_xml)

这里,代码主要是通过xml.etree.ElementTree解析xml文件。

然后在函数中补充上空格,</>等标签。

注意,这个函数是个递归的函数,会在函数内部调用函数本身。

实现的效果如下

在这里插入图片描述
可以发现,目前的问题是:

  • 没有注释
  • urdf最开始的标签,不见了。

相关文章:

xml格式化(1):使用python的xml库实现自闭合标签

前言 最近一段时间一直想要写一个urdf格式化插件。 至于为什么嘛&#xff0c;因为使用sw2urdf插件&#xff0c;导出的urdf&#xff0c;同一标签的内容&#xff0c;是跨行的&#xff0c;这就导致&#xff0c;内容比较乱&#xff0c;而且行数比较多。影响阅读。 因此&#xff…...

重温设计模式--13、策略模式

策略模式介绍 文章目录 策略模式介绍C 代码示例 策略模式是一种行为设计模式&#xff0c;它允许在运行时选择算法的行为。该模式将算法的定义和使用分离开来&#xff0c;使得算法可以独立于使用它的客户端而变化&#xff0c;提高了代码的灵活性和可维护性。 其主要包含以下几个…...

【Rust自学】10.7. 生命周期 Pt.3:输入输出生命周期与3规则

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 10.7.1. 深入理解生命周期 1.指定生命周期参数的方式依赖于函数所做的事情 以上一篇文章的…...

产品经理-竞品分析

竞品分析是企业制定战略和产品优化的关键步骤&#xff0c;通过深入分析竞争对手的产品与策略&#xff0c;企业可以更好地定位自己并寻找改进的方向。这篇文章详细阐述了进行有效竞品分析的五个关键步骤&#xff0c;帮助产品经理精准掌握竞争态势&#xff0c;从而在市场中占据有…...

51单片机——8*8LED点阵

LED 点阵的行则为发光二极管的阳极&#xff0c;LED 点阵的列则为发光二极管的阴极 根据 LED 发光二极管导通原理&#xff0c;当阳极为高电平&#xff0c;阴极为低电平则点亮&#xff0c;否则熄灭。 因此通过单片机P0口可控制点阵列&#xff0c;74HC595可控制点阵行 11 脚 SR…...

力扣第136题:只出现一次的数字 巧用异或

力扣第136题&#xff1a;只出现一次的数字 C语言解法 题目描述 给定一个非空的整数数组 nums &#xff0c;其中除一个元素只出现一次外&#xff0c;其他每个元素均出现两次。找出那个只出现一次的元素。 示例 示例 1: 输入: nums [2,2,1] 输出: 1示例 2: 输入: nums [4…...

TCP 如何获取端口信息

注&#xff1a;本文为 “TCP 如何获取端口信息” 相关讨论摘录。 机翻&#xff0c;未校。 How TCP Gets Port Information TCP 如何获取端口信息 asked Nov 10, 2024 at 19:57 user15503745 API Call for Connection API 调用以建立连接 Before the app can send data d…...

RabbitMQ发布确认高级篇(RabbitMQ Release Confirmation Advanced Edition)

系统学习消息队列——RabbitMQ的发布确认高级篇 简介 ‌RabbitMQ是一个开源的消息代理软件&#xff0c;实现了‌高级消息队列协议&#xff08;AMQP&#xff09;‌&#xff0c;主要用于在分布式系统中进行消息传递。RabbitMQ由‌‌Erlang语言编写&#xff0c;具有高性能、健壮…...

福建省乡镇界面数据arcgis格式shp乡镇名称和编码无偏移坐标内容测评

【标题解析】 标题"最新福建省乡镇界面数据arcgis格式shp乡镇名称和编码无偏移坐标"揭示了几个关键信息。这是关于福建省乡镇级别的地理数据&#xff0c;它包含乡镇的边界信息。这些数据是以ArcGIS兼容的SHP&#xff08;Shapefile&#xff09;格式存储的&#xff0c;…...

Kafka 消费者

Kafka消费者主要负责消费&#xff08;读取和处理&#xff09;由生产者发布的消息。 1 消费者入门 消费组将具有相同group.id的消费者实例组织成组。它们共同读取一个或多个主题的消息。每个消费者都有一个对应的消费组。 消息发布到主题后&#xff0c;只会被投递给订阅它的每…...

人形机器人当前现状与挑战:从技术突破到未来发展

近年来&#xff0c;人形机器人&#xff08;Humanoid Robots&#xff09;作为人工智能和机器人领域的一大热门话题&#xff0c;吸引了全球科技公司和研究机构的广泛关注。尤其是在日本、美国、欧洲等技术领先的地区&#xff0c;人形机器人的研究与发展日益繁荣&#xff0c;从早期…...

6 网络编程

基本概念扫盲 为什么需要计算机网络 如下图所示,A、B、C三个不同地域的主机要想进行通信不是凭空就可以通信的,而是需要基于互联网进行互相连接、通信。 为什么需要协议 如下图所示,红和蓝是联合攻打绿,它们以烽火为信号出动攻打绿,那么这时候就需要一个约定,比如红先…...

智能边缘计算:开启智能新时代

什么是智能边缘计算&#xff1f; 在当今数字化浪潮中&#xff0c;边缘计算已成为一个热门词汇。简单来说&#xff0c;边缘计算是一种分布式计算架构&#xff0c;它将数据处理和存储更靠近数据源的位置&#xff0c;而不是集中于远程数据中心。通过这种方式&#xff0c;边缘计算…...

AI投资分析:用于股票评级的大型语言模型(LLMs)

“AI in Investment Analysis: LLMs for Equity Stock Ratings” 论文地址&#xff1a;https://arxiv.org/pdf/2411.00856 摘要 投资分析作为金融服务领域的重要组成部分&#xff0c;LLMs&#xff08;大型语言模型&#xff09;为股票评级带来了改进的潜力。传统的股票评级方式…...

初始SpringBoot:详解特性和结构

??JAVA码农探花&#xff1a; ?? 推荐专栏&#xff1a;《SSM笔记》《SpringBoot笔记》 ??学无止境&#xff0c;不骄不躁&#xff0c;知行合一 目录 前言 一、SpringBoot项目结构 1.启动类的位置 2.pom文件 start parent 打包 二、依赖管理特性 三、自动配置特性…...

【计算机网络】深入解析OSI和TCP/IP模型:网络请求的底层处理过程

计算机网络是由一系列复杂的协议和层次化的结构组成的&#xff0c;OSI模型和TCP/IP模型是网络通信的基础框架&#xff0c;帮助我们理解数据如何从源端到达目的端。在这篇文章中&#xff0c;我将通过深入分析每一层的功能和具体处理流程&#xff0c;帮助你更加详细地理解网络请求…...

快速学习 pytest 基础知识

全篇大概 5000 字&#xff08;含代码&#xff09;&#xff0c;建议阅读时间10min 简介 Pytest是一个非常成熟的测试框架&#xff0c;适用于但愿测试、UI测试、接口测试。 简单灵活、上手快支持参数化具有多个第三方插件可以直接使用 assert 进行断言 一、Pytest安装 pip inst…...

Ae:合成设置 - 3D 渲染器

Ae菜单&#xff1a;合成/合成设置 Composition/Composition Settings 快捷键&#xff1a;Ctrl K After Effects “合成设置”对话框中的3D 渲染器 3D Renderer选项卡用于选择和配置合成的 3D 渲染器类型&#xff0c;所选渲染器决定了合成中的 3D 图层可以使用的功能&#xff0…...

java异步判断线程池所有任务是否执行完

在Java中&#xff0c;使用线程池&#xff08;ExecutorService&#xff09;可以高效地管理和执行异步任务。对于某些应用场景&#xff0c;可能需要异步地判断线程池中所有任务是否执行完毕。以下是一个高度专业的指南&#xff0c;讲解如何在Java中实现这一功能。 步骤概述 创建…...

25.1.3 UART串口通信

1.FSMP1A开发板进行串口通信实验&#xff1a; 功能&#xff1a;电脑输入LED_ON点亮扩展版LED灯&#xff0c;输入LED_OFF熄灭扩展版LED灯 代码实现&#xff1a; uart4.c #include "uart4.h" //串口初始化 void uart4_init(){//使能UART4外设时钟RCC->MP_APB1ENSE…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?

系列回顾&#xff1a; 在上一篇《React核心概念&#xff1a;State是什么&#xff1f;》中&#xff0c;我们学习了如何使用useState让一个组件拥有自己的内部数据&#xff08;State&#xff09;&#xff0c;并通过一个计数器案例&#xff0c;实现了组件的自我更新。这很棒&#…...

【PX4飞控】mavros gps相关话题分析,经纬度海拔获取方法,卫星数锁定状态获取方法

使用 ROS1-Noetic 和 mavros v1.20.1&#xff0c; 携带经纬度海拔的话题主要有三个&#xff1a; /mavros/global_position/raw/fix/mavros/gpsstatus/gps1/raw/mavros/global_position/global 查看 mavros 源码&#xff0c;来分析他们的发布过程。发现前两个话题都对应了同一…...

大模型真的像人一样“思考”和“理解”吗?​

Yann LeCun 新研究的核心探讨&#xff1a;大语言模型&#xff08;LLM&#xff09;的“理解”和“思考”方式与人类认知的根本差异。 核心问题&#xff1a;大模型真的像人一样“思考”和“理解”吗&#xff1f; 人类的思考方式&#xff1a; 你的大脑是个超级整理师。面对海量信…...

OPENCV图形计算面积、弧长API讲解(1)

一.OPENCV图形面积、弧长计算的API介绍 之前我们已经把图形轮廓的检测、画框等功能讲解了一遍。那今天我们主要结合轮廓检测的API去计算图形的面积&#xff0c;这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能&#xff0c;常用的API…...

基于 HTTP 的单向流式通信协议SSE详解

SSE&#xff08;Server-Sent Events&#xff09;详解 &#x1f9e0; 什么是 SSE&#xff1f; SSE&#xff08;Server-Sent Events&#xff09; 是 HTML5 标准中定义的一种通信机制&#xff0c;它允许服务器主动将事件推送给客户端&#xff08;浏览器&#xff09;。与传统的 H…...