如何使用python的xml庫(kù)實(shí)現(xiàn)自閉合標(biāo)簽
前言
最近一段時(shí)間一直想要寫(xiě)一個(gè)urdf格式化插件。
至于為什么嘛,因?yàn)槭褂胹w2urdf插件,導(dǎo)出的urdf,同一標(biāo)簽的內(nèi)容,是跨行的,這就導(dǎo)致,內(nèi)容比較亂,而且行數(shù)比較多。影響閱讀。
因此,自己想寫(xiě)格式化的腳本。
最近就開(kāi)始分享一些,之前的思考。
正文
import xml.etree.ElementTree as ET
def pretty_print(element, level=0, indent=" "):
"""
手動(dòng)格式化 XML 數(shù)據(jù),添加縮進(jìn)并將空元素轉(zhuǎn)換為自閉合標(biāo)簽。
:param element: XML 元素
:param level: 當(dāng)前縮進(jìn)級(jí)別
:param indent: 縮進(jìn)字符(默認(rèn)為兩個(gè)空格)
:return: 格式化后的 XML 字符串
"""
result = ""
if len(element) == 0: # 如果沒(méi)有子元素,即可能是空元素
if element.text and element.text.strip(): # 如果有文本內(nèi)容
result += f"{indent * level}<{element.tag}>{element.text.strip()}</{element.tag}>\n"
else:
result += f"{indent * level}<{element.tag} "
# 如果有屬性,添加到標(biāo)簽中
if element.attrib:
result += " ".join([f'{key}="{value}"' for key, value in element.attrib.items()])
result += " />\n" # 使用自閉合標(biāo)簽形式
else:
result += f"{indent * level}<{element.tag}"
# 如果有屬性,添加到標(biāo)簽中
if element.attrib:
result += " " + " ".join([f'{key}="{value}"' for key, value in element.attrib.items()])
result += ">\n"
# 處理元素的文本內(nèi)容
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)
# 處理結(jié)束標(biāo)簽
result += f"{indent * level}</{element.tag}>\n"
return result
# 讀取 XML 文件
file_path = 'test.urdf' # 請(qǐng)將此路徑替換為實(shí)際的文件路徑
tree = ET.parse(file_path)
root = tree.getroot()
# 直接格式化 root 元素,而不需要?jiǎng)?chuàng)建新的根節(jié)點(diǎn)
formatted_xml = pretty_print(root)
# 打印格式化后的 XML
print(formatted_xml)
with open('test_pretty.urdf', 'w') as f:
f.write(formatted_xml)這里,代碼主要是通過(guò)xml.etree.ElementTree解析xml文件。
然后在函數(shù)中補(bǔ)充上空格,<,/>等標(biāo)簽。
注意,這個(gè)函數(shù)是個(gè)遞歸的函數(shù),會(huì)在函數(shù)內(nèi)部調(diào)用函數(shù)本身。
實(shí)現(xiàn)的效果如下

可以發(fā)現(xiàn),目前的問(wèn)題是:
- 沒(méi)有注釋
- urdf最開(kāi)始的標(biāo)簽,不見(jiàn)了。
到此這篇關(guān)于使用python的xml庫(kù)實(shí)現(xiàn)自閉合標(biāo)簽的文章就介紹到這了,更多相關(guān)python xml庫(kù)自閉合標(biāo)簽內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python自己定義一個(gè)求累加和的函數(shù)方式
定義了一個(gè)函數(shù)來(lái)計(jì)算不確定數(shù)量參數(shù)的累加和,使用`*args`來(lái)接收不定數(shù)量的位置參數(shù),函數(shù)內(nèi)部通過(guò)遍歷`args`并使用`sum()`函數(shù)計(jì)算所有參數(shù)的累加和,運(yùn)行結(jié)果是累加和的值2025-11-11
PyTorch?Distributed?Data?Parallel使用詳解
這篇文章主要為大家介紹了PyTorch?Distributed?Data?Parallel使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Python實(shí)現(xiàn)圖像增強(qiáng)
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)圖像增強(qiáng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
輕松掌握python設(shè)計(jì)模式之訪問(wèn)者模式
這篇文章主要幫助大家輕松掌握python設(shè)計(jì)模式之訪問(wèn)者模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
在 Django/Flask 開(kāi)發(fā)服務(wù)器上使用 HTTPS
使用 Django 或 Flask 這種框架開(kāi)發(fā) web app 的時(shí)候一般都會(huì)用內(nèi)建服務(wù)器開(kāi)發(fā)和調(diào)試程序,等程序完成后再移交到生產(chǎn)環(huán)境部署。問(wèn)題是這些內(nèi)建服務(wù)器通常都不支持 HTTPS,那么我們來(lái)探討下開(kāi)啟https吧2014-07-07
使用IPython來(lái)操作Docker容器的入門(mén)指引
這篇文章主要介紹了使用IPython來(lái)操作Docker容器的方法,包括一些基本的搭建和連接,主要依靠docker-py模塊,需要的朋友可以參考下2015-04-04
Python中的模式匹配庫(kù)Pampy使用實(shí)例解析
這篇文章主要為大家介紹了Python中的模式匹配庫(kù)Pampy使用實(shí)例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01

