前言
这篇文章,是用来增加头部声明。
正文
from lxml import etree
def pretty_print(element, level=0, indent=" "):
result = ""
# 判断元素是否为注释节点
if isinstance(element, etree._Comment):
result += f"{indent * level}<!--{element.text}-->\n"
return 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 = etree.parse(file_path)
root = tree.getroot()
# 直接格式化 root 元素,而不需要创建新的根节点
formatted_xml = pretty_print(root)
# 获取 XML 声明部分
xml_declaration = etree.tostring(root.getroottree(), xml_declaration=True, encoding='utf-8', pretty_print=False).decode('utf-8').split('\n')[0] + '\n'
# 组合 XML 声明和格式化后的 XML
final_xml = xml_declaration + formatted_xml
# 打印格式化后的 XML
print(final_xml)
# 保存格式化后的 XML 到文件
with open('自闭合标签+保留注释+头部声明.urdf', 'w', encoding='utf-8') as f:
f.write(final_xml)