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)??梢允亲址J(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)ip地址查詢(xún)經(jīng)緯度定位詳解
這篇文章主要介紹了python實(shí)現(xiàn)ip地址查詢(xún)經(jīng)緯度定位詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Python的加密模塊之hashlib 與 base64詳解及常用加密方法
我們來(lái)學(xué)習(xí)一下 Python 中的加密模塊,加密模塊在工作中被廣泛應(yīng)用,比如數(shù)據(jù)的傳入 不希望被捕獲,通過(guò)把數(shù)據(jù)加密。這樣即使被捕獲也無(wú)法獲取到數(shù)據(jù)的真實(shí)信息,今天我們就來(lái)學(xué)習(xí)一下關(guān)于加密的方法,感興趣的朋友跟隨小編一起看看吧2023-02-02
python3中超級(jí)好用的日志模塊-loguru模塊使用詳解
loguru默認(rèn)的輸出格式是上面的內(nèi)容,有時(shí)間、級(jí)別、模塊名、行號(hào)以及日志信息,不需要手動(dòng)創(chuàng)建?logger,直接使用即可,另外其輸出還是彩色的,看起來(lái)會(huì)更加友好,這篇文章主要介紹了python3中超級(jí)好用的日志模塊-loguru模塊使用詳解,需要的朋友可以參考下2022-11-11
python3 寫(xiě)一個(gè)WAV音頻文件播放器的代碼
本文通過(guò)實(shí)例代碼給大家介紹了python3 寫(xiě)一個(gè)WAV音頻文件播放器,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09

