今天我們將學習如何在Python中將XML轉換為JSON和字典。我們可以使用Python的xmltodict
模塊來讀取XML文件並將其轉換為字典或JSON數據。我們還可以在大型XML文件上進行流式處理,並將其轉換為字典。在進入編程部分之前,讓我們首先了解為什麼需要進行XML轉換。
將XML轉換為字典/JSON
XML文件已經逐漸過時,但網絡上仍然存在許多使用此格式的大型系統。XML比JSON更重,因此大多數開發人員在其應用中更喜歡後者。當應用程序需要理解來自任何來源的XML時,將其轉換為JSON可能是一項繁瑣的任務。Python中的xmltodict
模塊使這項任務變得非常容易和直觀。
開始使用xmltodict
我們可以開始使用xmltodict
模塊,但首先需要安裝它。我們將主要使用pip進行安裝。
安裝 xmltodict 模組
這是我們如何使用Python Package Index(pip)安裝 xmltodict 模組的方法:
pip install xmltodict
這將迅速完成,因為xmltodict
是一個非常輕量級的模組。以下是此安裝的輸出:這個安裝的最好之處在於,此模組不依賴於任何其他外部模組,因此它是輕量級的並避免任何版本衝突。為了示範,在基於 Debian 的系統上,此模組可以輕鬆使用
apt
工具安裝:
sudo apt install python-xmltodict
另一個優點是,此模組具有一個官方的 Debian 套件。
Python XML 轉 JSON
開始嘗試此模組的最佳地方是執行它主要用於執行的操作之一,進行 XML 轉 JSON 轉換。讓我們看一下如何完成這個操作的代碼片段:
import xmltodict
import pprint
import json
my_xml = """
<audience>
<id what="attribute">123</id>
<name>Shubham</name>
</audience>
"""
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(json.dumps(xmltodict.parse(my_xml)))
讓我們看看這個程式的輸出:在這裡,我們僅使用
parse(...)
函數將XML數據轉換為JSON,然後使用json
模塊以更好的格式打印JSON。
將XML文件轉換為JSON
將XML數據保留在代碼本身中既不總是可能的,也不現實。通常,我們將數據保存在數據庫或一些文件中。我們也可以直接選擇文件並將其轉換為JSON。讓我們看一個代碼片段,我們如何使用XML文件執行轉換:
import xmltodict
import pprint
import json
with open('person.xml') as fd:
doc = xmltodict.parse(fd.read())
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(json.dumps(doc))
讓我們看看這個程式的輸出:在這裡,我們使用另一個模塊pprint以格式化的方式打印輸出。除此之外,使用
open(...)
函數很直接,我們用它來獲取文件描述符,然後將文件解析為JSON對象。
Python XML to Dict
根據模組名稱本身所暗示的,xmltodict實際上將我們提供的XML數據轉換為一個簡單的Python字典。因此,我們也可以通過字典鍵簡單地訪問數據。這是一個示例程序:
import xmltodict
import pprint
import json
my_xml = """
<audience>
<id what="attribute">123</id>
<name>Shubham</name>
</audience>
"""
my_dict = xmltodict.parse(my_xml)
print(my_dict['audience']['id'])
print(my_dict['audience']['id']['@what'])
讓我們看看此程序的輸出: 因此,標籤可以作為鍵,屬性鍵也可以一起使用。屬性鍵只需要以
@
符號作為前綴。
支援XML中的命名空間
在XML數據中,通常有一組命名空間,它定義了XML文件提供的數據的範圍。在轉換為JSON格式時,這些命名空間必須在JSON格式中保持。讓我們考慮這個示例XML文件:
<root xmlns="https://defaultns.com/"
xmlns:a="https://a.com/">
<audience>
<id what="attribute">123</id>
<name>Shubham</name>
</audience>
</root>
這是一個示例程序,展示了我們如何在JSON格式中包含XML命名空間:
import xmltodict
import pprint
import json
with open('person.xml') as fd:
doc = xmltodict.parse(fd.read(), process_namespaces=True)
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(json.dumps(doc))
讓我們看看此程序的輸出:
JSON轉換為XML
儘管將XML轉換為JSON是這個模塊的主要目標,xmltodict還支持反向操作,即將JSON轉換為XML形式。我們將在程序中提供JSON數據。這是一個示例程序:
import xmltodict
student = {
"data" : {
"name" : "Shubham",
"marks" : {
"math" : 92,
"english" : 99
},
"id" : "s387hs3"
}
}
print(xmltodict.unparse(student, pretty=True))
讓我們看一下這個程序的輸出:請注意,給出單個JSON鍵對於正確工作是必要的。如果我們考慮修改我們的程序,在數據的第一級包含多個JSON鍵,如:
import xmltodict
student = {
"name" : "Shubham",
"marks" : {
"math" : 92,
"english" : 99
},
"id" : "s387hs3"
}
print(xmltodict.unparse(student, pretty=True))
在這種情況下,我們在根級別有三個鍵。如果我們嘗試解析這種形式的JSON,我們將遇到此錯誤:這是因為xmltodict需要使用第一個鍵構造JSON作為根XML標籤。這意味著數據的根級別只能有一個JSON鍵。
結論
在本課程中,我們學習了一個優秀的Python模塊,可以用於解析和轉換XML到JSON和反之亦然。我們還學習了如何使用xmltodict模塊將XML轉換為字典。參考:API文檔
Source:
https://www.digitalocean.com/community/tutorials/python-xml-to-json-dict