Python利用xmltodict實(shí)現(xiàn)字典和xml互相轉(zhuǎn)換的示例代碼
xmltodict簡(jiǎn)介
概念
- xmltodict是Python中用于處理XML數(shù)據(jù)的模塊,它可將XML數(shù)據(jù)轉(zhuǎn)換為字典,簡(jiǎn)化XML解析過(guò)程,同時(shí)保留數(shù)據(jù)結(jié)構(gòu),便于操作。
- 反之,也可將字典轉(zhuǎn)回XML格式。此模塊在處理XML時(shí)提供了直觀、簡(jiǎn)潔的接口;
xmltodict按照
xmltodict模塊屬于Python第三方庫(kù),需要額外下載安裝,命令如下:
pip install xmltodict
生成XML數(shù)據(jù)
unparser函數(shù)用于將Python字典轉(zhuǎn)換為XML數(shù)據(jù),便于數(shù)據(jù)的存儲(chǔ)和傳輸;
參數(shù)含義如下:
- input_dict:要轉(zhuǎn)換為XML的Python字典。
- output(可選):輸出的目標(biāo)。可以是字符串(默認(rèn))或文件對(duì)象。
- pretty(可選):是否美化輸出。默認(rèn)為False。
- full_document(可選):是否輸出完整的XML文檔,包括XML聲明。默認(rèn)為T(mén)rue。
import xmltodict
# Python 字典
data = {
'persons':
{
'person':
[
{
'name': '張三', 'age': '18', 'gender': '男',
'address': {'street': '浦東大道', 'district': '浦東新區(qū)', 'city': '上海', 'state': '中國(guó)'}
},
{
'name': '李四', 'age': '20', 'gender': '女',
'address': {'street': '藍(lán)靛廠路', 'district': '海淀區(qū)', 'city': '北京', 'state': '中國(guó)'}}
]
}
}
# 將字典轉(zhuǎn)換為 XML 數(shù)據(jù)
xml_string = xmltodict.unparse(data, pretty=True)
# 打印 XML 數(shù)據(jù)
print(xml_string)
# <?xml version="1.0" encoding="utf-8"?>
# <persons>
# <person>
# <name>張三</name>
# <age>18</age>
# <gender>男</gender>
# <address>
# <street>浦東大道</street>
# <district>浦東新區(qū)</district>
# <city>上海</city>
# <state>中國(guó)</state>
# </address>
# </person>
# <person>
# <name>李四</name>
# <age>20</age>
# <gender>女</gender>
# <address>
# <street>藍(lán)靛廠路</street>
# <district>海淀區(qū)</district>
# <city>北京</city>
# <state>中國(guó)</state>
# </address>
# </person>
# </persons>
解析XML數(shù)據(jù)
parse函數(shù)將XML數(shù)據(jù)解析為Python字典,使得你可以使用Python的語(yǔ)法來(lái)訪問(wèn)和操作XML數(shù)據(jù)。
參數(shù)含義如下:
- xml_input:要解析的XML數(shù)據(jù)??梢允亲址蛭募?duì)象。
- encoding(可選):XML文檔的編碼。默認(rèn)為None,意味著使用XML文檔中指定的編碼。
- expat(可選):自定義的XML解析器。默認(rèn)使用Python標(biāo)準(zhǔn)庫(kù)中的xml.parsers.expat。
- process_namespaces(可選):是否處理命名空間。默認(rèn)為False。
- namespace_separator(可選):當(dāng)process_namespaces=True時(shí),命名空間和標(biāo)簽名之間的分隔符。默認(rèn)為:。
- postprocessor(可選):一個(gè)函數(shù),它會(huì)在每個(gè)元素解析完成后被調(diào)用。這允許用戶(hù)修改解析結(jié)果,例如,可以用來(lái)轉(zhuǎn)換數(shù)據(jù)類(lèi)型或合并節(jié)點(diǎn)。它接收三個(gè)參數(shù):path、key和value。path是當(dāng)前元素的父元素路徑,key是當(dāng)前元素的標(biāo)簽名,value是當(dāng)前元素的值(可能是文本、屬性字典或子元素的字典)。
- dict_constructor(可選):用于創(chuàng)建字典的構(gòu)造函數(shù)。默認(rèn)情況下,xmltodict使用內(nèi)置的dict函數(shù)來(lái)構(gòu)造字典。如果你想使用其他類(lèi)型的字典(例如,collections.OrderedDict以保持元素的順序),可以通過(guò)這個(gè)參數(shù)指定。
- xml_attribs(可選):控制解析器是否應(yīng)該包含元素的屬性。默認(rèn)為T(mén)rue,意味著元素的屬性會(huì)被包含在解析結(jié)果中。如果設(shè)置為False,則屬性將被忽略,只有元素的文本內(nèi)容和子元素會(huì)被包含。
import xmltodict
# XML 數(shù)據(jù)
xml_string = '''
<persons>
<person>
<name>張三</name>
<age>18</age>
<gender>男</gender>
<address>
<street>浦東大道</street>
<district>浦東新區(qū)</district>
<city>上海</city>
<state>中國(guó)</state>
</address>
</person>
<person>
<name>李四</name>
<age>20</age>
<gender>女</gender>
<address>
<street>藍(lán)靛廠路</street>
<district>海淀區(qū)</district>
<city>北京</city>
<state>中國(guó)</state>
</address>
</person>
</persons>
'''
# 解析 XML 數(shù)據(jù)
data = xmltodict.parse(xml_string)
print(type(data), data) # <class 'dict'> {'persons': {'person': [{'name': '張三', 'age': '18', 'gender': '男', 'address': {'street': '浦東大道', 'district': '浦東新區(qū)', 'city': '上海', 'state': '中國(guó)'}}, {'name': '李四', 'age': '20', 'gender': '女', 'address': {'street': '藍(lán)靛廠路', 'district': '海淀區(qū)', 'city': '北京', 'state': '中國(guó)'}}]}}
# 訪問(wèn)數(shù)據(jù)
print(data['persons']['person'][0]['name']) # 輸出: 張三
print(data['persons']['person'][1]['name']) # 輸出: 李四
拓展
1.改變屬性前綴
attr_prefix參數(shù)用于指定XML屬性在轉(zhuǎn)換為字典時(shí)的鍵前綴。默認(rèn)值是’@'。
import xmltodict
xml_string = '''
<persons>
<person name="zhangsan" age="18" gender="男">
<address>上海市浦東新區(qū)</address>
</person>
<person name="lisi" age="20" gender="女">
<address>北京市海淀區(qū)</address>
</person>
</persons>
'''
#
data1 = xmltodict.parse(xml_string)
print(data1)
# 使用默認(rèn)的attr_prefix='@'參數(shù)值,輸出如下:
# {'persons':
# {
# 'person': [
# {'@name': 'zhangsan', '@age': '18', '@gender': '男', 'address': '上海市浦東新區(qū)'},
# {'@name': 'lisi', '@age': '20', '@gender': '女', 'address': '北京市海淀區(qū)'}
# ]
# }
# }
data2 = xmltodict.parse(xml_string, attr_prefix='attr_')
print(data2)
# 使用自定義attr_prefix='attr_'參數(shù)值,輸出如下:
# {'persons':
# {
# 'person': [
# {'attr_name': 'zhangsan', 'attr_age': '18', 'attr_gender': '男', 'address': '上海市浦東新區(qū)'},
# {'attr_name': 'lisi', 'attr_age': '20', 'attr_gender': '女', 'address': '北京市海淀區(qū)'}
# ]
# }
# }2.去除文本值中的空白字符
strip_whitespace參數(shù)用于控制是否去除文本值中的空白字符。默認(rèn)值是True。
import xmltodict
xml_string = '''
<person name="zhangsan">
<address> 上海市浦東新區(qū)</address>
</person>
'''
# strip_whitespace=True (默認(rèn))
data1 = xmltodict.parse(xml_string)
print(data1) # {'person': {'@name': 'zhangsan', 'address': '上海市浦東新區(qū)'}}
# strip_whitespace=False
data2 = xmltodict.parse(xml_string, strip_whitespace=False)
print(data2) # {'person': {'@name': 'zhangsan', 'address': ' 上海市浦東新區(qū)', '#text': '\n \n'}}3.去除空值標(biāo)簽
利用postprocessor鉤子指定一個(gè)按照預(yù)想邏輯處理key、value值的函數(shù);
import xmltodict
xml_string = '''
<persons>
<person>
<name>張三</name>
<age>18</age>
<gender>男</gender>
<address>
<street></street>
<district desc="test">浦東新區(qū)</district>
<city></city>
<state>中國(guó)</state>
</address>
</person>
<person>
<name>李四</name>
<age>20</age>
<gender>女</gender>
<address>
<street></street>
<district desc="test"></district>
<city>北京</city>
<state>中國(guó)</state>
</address>
</person>
</persons>
'''
def _remove_empty(_, key, value):
if value is None:
return
return key, value
result1 = xmltodict.parse(xml_string)
result2 = xmltodict.parse(xml_string, postprocessor=_remove_empty)
print(result1['persons']['person'][0]['address']) # 輸出: {'street': None, 'district': {'@desc': 'test', '#text': '浦東新區(qū)'}, 'city': None, 'state': '中國(guó)'}
print(result2['persons']['person'][0]['address']) # 輸出: {'district': {'@desc': 'test', '#text': '浦東新區(qū)'}, 'state': '中國(guó)'}
print(result1['persons']['person'][1]['address']) # 輸出: {'street': None, 'district': {'@desc': 'test'}, 'city': '北京', 'state': '中國(guó)'}
print(result2['persons']['person'][1]['address']) # 輸出: {'district': {'@desc': 'test'}, 'city': '北京', 'state': '中國(guó)'}總結(jié)
xmltodict模塊是處理XML數(shù)據(jù)的強(qiáng)大工具,它結(jié)合了XML的靈活性和Python字典的簡(jiǎn)便性;
無(wú)論是需要解析復(fù)雜的XML文檔,還是需要生成結(jié)構(gòu)化的XML數(shù)據(jù),xmltodict都能簡(jiǎn)單而又直觀的勝任;
通過(guò)將XML處理過(guò)程與Python字典操作相結(jié)合,xmltodict極大地簡(jiǎn)化了XML數(shù)據(jù)的處理流程,使得開(kāi)發(fā)者可以更加專(zhuān)注于業(yè)務(wù)邏輯的實(shí)現(xiàn)。
到此這篇關(guān)于Python利用xmltodict實(shí)現(xiàn)字典和xml互相轉(zhuǎn)換的示例代碼的文章就介紹到這了,更多相關(guān)Python 字典和xml互相轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)pdf文檔轉(zhuǎn)txt的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)pdf文檔轉(zhuǎn)txt的方法,結(jié)合實(shí)例形式分析了Python基于第三方庫(kù)pdfminier實(shí)現(xiàn)針對(duì)pdf格式文檔的讀取、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
Linux下使用python自動(dòng)修改本機(jī)網(wǎng)關(guān)代碼分享
這篇文章主要介紹了Linux下使用python自動(dòng)修改本機(jī)網(wǎng)關(guān)代碼分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-05-05
django+celery如何實(shí)現(xiàn)定時(shí)拉取阿里云rocketmq實(shí)例信息
這篇文章主要介紹了django+celery如何實(shí)現(xiàn)定時(shí)拉取阿里云rocketmq實(shí)例信息,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-07-07
使用python實(shí)現(xiàn)讀取文件夾中所有excel
相信很多坐在辦公室上班的朋友每天都需要處理大量的數(shù)據(jù),本文我們就來(lái)看看如何使用Openpyxl讀取文件夾下所有Excel文檔中的數(shù)據(jù),文中示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2025-12-12
基于Python實(shí)現(xiàn)密碼生成與管理工具(進(jìn)階版)
在現(xiàn)代數(shù)字生活中,密碼是保護(hù)個(gè)人信息和賬戶(hù)安全的第一道防線,本文將詳細(xì)介紹一個(gè)簡(jiǎn)單的密碼生成與管理工具的實(shí)現(xiàn)方式,希望對(duì)大家有所幫助2025-08-08

