Python利用xmltodict實現(xiàn)字典和xml互相轉(zhuǎn)換的示例代碼
xmltodict簡介
概念
- xmltodict是Python中用于處理XML數(shù)據(jù)的模塊,它可將XML數(shù)據(jù)轉(zhuǎn)換為字典,簡化XML解析過程,同時保留數(shù)據(jù)結(jié)構(gòu),便于操作。
- 反之,也可將字典轉(zhuǎn)回XML格式。此模塊在處理XML時提供了直觀、簡潔的接口;
xmltodict按照
xmltodict模塊屬于Python第三方庫,需要額外下載安裝,命令如下:
pip install xmltodict
生成XML數(shù)據(jù)
unparser函數(shù)用于將Python字典轉(zhuǎn)換為XML數(shù)據(jù),便于數(shù)據(jù)的存儲和傳輸;
參數(shù)含義如下:
- input_dict:要轉(zhuǎn)換為XML的Python字典。
- output(可選):輸出的目標。可以是字符串(默認)或文件對象。
- pretty(可選):是否美化輸出。默認為False。
- full_document(可選):是否輸出完整的XML文檔,包括XML聲明。默認為True。
import xmltodict # Python 字典 data = { 'persons': { 'person': [ { 'name': '張三', 'age': '18', 'gender': '男', 'address': {'street': '浦東大道', 'district': '浦東新區(qū)', 'city': '上海', 'state': '中國'} }, { 'name': '李四', 'age': '20', 'gender': '女', 'address': {'street': '藍靛廠路', 'district': '海淀區(qū)', 'city': '北京', 'state': '中國'}} ] } } # 將字典轉(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>中國</state> # </address> # </person> # <person> # <name>李四</name> # <age>20</age> # <gender>女</gender> # <address> # <street>藍靛廠路</street> # <district>海淀區(qū)</district> # <city>北京</city> # <state>中國</state> # </address> # </person> # </persons>
解析XML數(shù)據(jù)
parse函數(shù)將XML數(shù)據(jù)解析為Python字典,使得你可以使用Python的語法來訪問和操作XML數(shù)據(jù)。
參數(shù)含義如下:
- xml_input:要解析的XML數(shù)據(jù)??梢允亲址蛭募ο?。
- encoding(可選):XML文檔的編碼。默認為None,意味著使用XML文檔中指定的編碼。
- expat(可選):自定義的XML解析器。默認使用Python標準庫中的xml.parsers.expat。
- process_namespaces(可選):是否處理命名空間。默認為False。
- namespace_separator(可選):當process_namespaces=True時,命名空間和標簽名之間的分隔符。默認為:。
- postprocessor(可選):一個函數(shù),它會在每個元素解析完成后被調(diào)用。這允許用戶修改解析結(jié)果,例如,可以用來轉(zhuǎn)換數(shù)據(jù)類型或合并節(jié)點。它接收三個參數(shù):path、key和value。path是當前元素的父元素路徑,key是當前元素的標簽名,value是當前元素的值(可能是文本、屬性字典或子元素的字典)。
- dict_constructor(可選):用于創(chuàng)建字典的構(gòu)造函數(shù)。默認情況下,xmltodict使用內(nèi)置的dict函數(shù)來構(gòu)造字典。如果你想使用其他類型的字典(例如,collections.OrderedDict以保持元素的順序),可以通過這個參數(shù)指定。
- xml_attribs(可選):控制解析器是否應(yīng)該包含元素的屬性。默認為True,意味著元素的屬性會被包含在解析結(jié)果中。如果設(shè)置為False,則屬性將被忽略,只有元素的文本內(nèi)容和子元素會被包含。
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>中國</state> </address> </person> <person> <name>李四</name> <age>20</age> <gender>女</gender> <address> <street>藍靛廠路</street> <district>海淀區(qū)</district> <city>北京</city> <state>中國</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': '中國'}}, {'name': '李四', 'age': '20', 'gender': '女', 'address': {'street': '藍靛廠路', 'district': '海淀區(qū)', 'city': '北京', 'state': '中國'}}]}} # 訪問數(shù)據(jù) print(data['persons']['person'][0]['name']) # 輸出: 張三 print(data['persons']['person'][1]['name']) # 輸出: 李四
拓展
1.改變屬性前綴
attr_prefix參數(shù)用于指定XML屬性在轉(zhuǎ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) # 使用默認的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ù)用于控制是否去除文本值中的空白字符。默認值是True。
import xmltodict xml_string = ''' <person name="zhangsan"> <address> 上海市浦東新區(qū)</address> </person> ''' # strip_whitespace=True (默認) 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.去除空值標簽
利用postprocessor鉤子指定一個按照預(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>中國</state> </address> </person> <person> <name>李四</name> <age>20</age> <gender>女</gender> <address> <street></street> <district desc="test"></district> <city>北京</city> <state>中國</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': '中國'} print(result2['persons']['person'][0]['address']) # 輸出: {'district': {'@desc': 'test', '#text': '浦東新區(qū)'}, 'state': '中國'} print(result1['persons']['person'][1]['address']) # 輸出: {'street': None, 'district': {'@desc': 'test'}, 'city': '北京', 'state': '中國'} print(result2['persons']['person'][1]['address']) # 輸出: {'district': {'@desc': 'test'}, 'city': '北京', 'state': '中國'}
總結(jié)
xmltodict模塊是處理XML數(shù)據(jù)的強大工具,它結(jié)合了XML的靈活性和Python字典的簡便性;
無論是需要解析復(fù)雜的XML文檔,還是需要生成結(jié)構(gòu)化的XML數(shù)據(jù),xmltodict都能簡單而又直觀的勝任;
通過將XML處理過程與Python字典操作相結(jié)合,xmltodict極大地簡化了XML數(shù)據(jù)的處理流程,使得開發(fā)者可以更加專注于業(yè)務(wù)邏輯的實現(xiàn)。
到此這篇關(guān)于Python利用xmltodict實現(xiàn)字典和xml互相轉(zhuǎn)換的示例代碼的文章就介紹到這了,更多相關(guān)Python 字典和xml互相轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實現(xiàn)ip地址查詢經(jīng)緯度定位詳解
這篇文章主要介紹了python實現(xiàn)ip地址查詢經(jīng)緯度定位詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08Python的加密模塊之hashlib 與 base64詳解及常用加密方法
我們來學(xué)習(xí)一下 Python 中的加密模塊,加密模塊在工作中被廣泛應(yīng)用,比如數(shù)據(jù)的傳入 不希望被捕獲,通過把數(shù)據(jù)加密。這樣即使被捕獲也無法獲取到數(shù)據(jù)的真實信息,今天我們就來學(xué)習(xí)一下關(guān)于加密的方法,感興趣的朋友跟隨小編一起看看吧2023-02-02python3中超級好用的日志模塊-loguru模塊使用詳解
loguru默認的輸出格式是上面的內(nèi)容,有時間、級別、模塊名、行號以及日志信息,不需要手動創(chuàng)建?logger,直接使用即可,另外其輸出還是彩色的,看起來會更加友好,這篇文章主要介紹了python3中超級好用的日志模塊-loguru模塊使用詳解,需要的朋友可以參考下2022-11-11