Python XML 轉 JSON,XML 轉 Dict

今天我們將學習如何在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