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

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

前言

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

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

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

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

正文

import xml.etree.ElementTree as ET


def 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最开始的标签,不见了。

http://www.kler.cn/a/466879.html

相关文章:

  • 华为 Sensor 省电策略调研
  • 开源存储详解-分布式存储与ceph
  • 云原生监控与日志管理:确保云原生应用的可靠性与性能
  • 数据挖掘——朴素贝叶斯分类
  • 基于Web的足球青训俱乐部管理后台系统的设计与开发源码(springboot+mysql+vue)
  • 机器学习周报-ModernTCN文献阅读
  • 青少年编程与数学 02-005 移动Web编程基础 12课题、移动表单
  • 编写可复用性的模块
  • 【51单片机零基础-chapter4:LED数码管】
  • 机器学习基础-机器学习的常用学习方法
  • c++ 递推
  • 「Mac畅玩鸿蒙与硬件50」UI互动应用篇27 - 水果掉落小游戏
  • asp.net core mvc的 ViewBag 和 ViewData 和 Module
  • 腾讯云大数据智能管家:AI驱动管理效能飞升
  • 何为进程、何为线程、如何理解 JS 的异步、什么是JS的事件循环、任务有优先级吗、JS中的计时器能做到精确计时吗
  • MySQL 08 章——聚合函数
  • AI代码开发实践-微信小程序开发
  • 在Typora中实现自动编号
  • 「C++笔记」vector:C++中的新式“数组”
  • 新服务器Linux网络配置
  • vue+js+Java在分页的el-table里实现上移、下移;置顶
  • 计算机网络复习(学习通作业4、5、6系统答案)
  • 细说STM32F407单片机轮询方式CAN通信
  • 【读书笔记·VLSI电路设计方法解密】问题36:一个好的设计流程有哪些特点
  • C语言里面的size_t是什么意思
  • 云计算在医疗行业的应用