Python XML zu JSON, XML zu Dict

Heute werden wir lernen, wie man XML in JSON und XML in ein Dictionary in Python konvertiert. Wir können das Python-Modul xmltodict verwenden, um eine XML-Datei zu lesen und sie in ein Dictionary oder JSON-Daten zu konvertieren. Wir können auch über große XML-Dateien streamen und sie in ein Dictionary konvertieren. Bevor wir zum Codierungsteil übergehen, sollten wir zuerst verstehen, warum die XML-Konvertierung notwendig ist.

XML in Dictionary/JSON konvertieren

XML-Dateien sind langsam veraltet geworden, aber es gibt ziemlich große Systeme im Web, die dieses Format noch verwenden. XML ist schwerer als JSON und daher bevorzugen die meisten Entwickler letzteres in ihren Anwendungen. Wenn Anwendungen das von einer beliebigen Quelle bereitgestellte XML verstehen müssen, kann es eine mühsame Aufgabe sein, es in JSON zu konvertieren. Das xmltodict-Modul in Python macht diese Aufgabe äußerst einfach und unkompliziert durchführbar.

Erste Schritte mit xmltodict

Wir können mit dem xmltodict-Modul beginnen, aber wir müssen es zuerst installieren. Wir werden hauptsächlich pip verwenden, um die Installation durchzuführen.

Installieren Sie das xmltodict-Modul

Hier ist, wie Sie das xmltodict-Modul mit dem Python Package Index (pip) installieren können:

pip install xmltodict

Dies wird schnell erledigt sein, da xmltodict ein sehr leichtes Modul ist. Hier ist die Ausgabe für diese Installation: Das Beste an dieser Installation war, dass dieses Modul nicht von einem anderen externen Modul abhängig ist und daher leichtgewichtig ist und Konflikte mit anderen Versionen vermeidet. Nur zur Demonstration, auf Debian-basierten Systemen kann dieses Modul leicht mit dem apt-Tool installiert werden:

sudo apt install python-xmltodict

Ein weiterer Pluspunkt ist, dass dieses Modul ein offizielles Debian-Paket hat.

Python XML zu JSON

Der beste Ort, um mit diesem Modul zu beginnen, ist eine Operation durchzuführen, für die es hauptsächlich entwickelt wurde, nämlich XML in JSON umzuwandeln. Schauen wir uns einen Codeausschnitt an, wie dies gemacht werden kann:

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)))

Lassen Sie uns die Ausgabe dieses Programms sehen: Hier verwenden wir einfach die parse(...)-Funktion, um XML-Daten in JSON umzuwandeln, und dann verwenden wir das json-Modul, um JSON in einem besseren Format auszugeben.

XML-Datei in JSON konvertieren

XML-Daten direkt im Code zu behalten, ist weder immer möglich noch realistisch. Normalerweise halten wir unsere Daten entweder in einer Datenbank oder in Dateien. Wir können auch Dateien direkt auswählen und sie in JSON konvertieren. Sehen wir uns einen Code-Ausschnitt an, wie wir die Konvertierung mit einer XML-Datei durchführen können:

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))

Lassen Sie uns die Ausgabe dieses Programms sehen: Hier haben wir ein weiteres Modul pprint verwendet, um die Ausgabe formatiert auszugeben. Abgesehen davon war die Verwendung der open(...)-Funktion unkompliziert, wir haben sie verwendet, um einen Datei-Deskriptor zu erhalten und dann die Datei in ein JSON-Objekt zu parsen.

Python XML zu Dict

Wie der Modulname selbst suggeriert, wandelt xmltodict die von uns bereitgestellten XML-Daten in ein einfaches Python-Wörterbuch um. So können wir einfach auf die Daten mit den Wörterbuchschlüsseln zugreifen. Hier ist ein Beispielprogramm:

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'])

Schauen wir uns die Ausgabe für dieses Programm an: Die Tags können als Schlüssel zusammen mit den Attributschlüsseln verwendet werden. Die Attributschlüssel müssen einfach mit dem Symbol @ vorangestellt werden.

Unterstützung von Namespaces in XML

In XML-Daten haben wir normalerweise einen Satz von Namespaces, die den Geltungsbereich der Daten festlegen, die von der XML-Datei bereitgestellt werden. Beim Konvertieren in das JSON-Format ist es dann notwendig, dass diese Namespaces auch im JSON-Format erhalten bleiben. Betrachten wir diese Beispieldatei:

<root xmlns="https://defaultns.com/"
        xmlns:a="https://a.com/">
    <audience>
        <id what="attribute">123</id>
        <name>Shubham</name>
    </audience>
</root>

Hier ist ein Beispielprogramm, wie wir XML-Namespaces auch im JSON-Format einbinden können:

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))

Schauen wir uns die Ausgabe für dieses Programm an:

JSON in XML konvertieren

Obwohl die Konvertierung von XML in JSON das Hauptziel dieses Moduls ist, unterstützt xmltodict auch die Umkehrung, die Konvertierung von JSON in XML-Form. Wir werden die JSON-Daten im Programm selbst bereitstellen. Hier ist ein Beispielprogramm:

import xmltodict

student = {
  "data" : {
    "name" : "Shubham",
    "marks" : {
      "math" : 92,
      "english" : 99
    },
    "id" : "s387hs3"
  }
}

print(xmltodict.unparse(student, pretty=True))

Lasst uns das Ausgabe für dieses Programm sehen: Bitte beachten Sie, dass die Angabe eines einzelnen JSON-Schlüssels erforderlich ist, damit dies korrekt funktioniert. Wenn wir berücksichtigen, dass wir unser Programm so ändern, dass es mehrere JSON-Schlüssel auf der obersten Ebene der Daten enthält, wie zum Beispiel:

import xmltodict

student = {
    "name" : "Shubham",
    "marks" : {
        "math" : 92,
        "english" : 99
    },
    "id" : "s387hs3"
}

print(xmltodict.unparse(student, pretty=True))

In diesem Fall haben wir drei Schlüssel auf der Wurzelebene. Wenn wir versuchen, diese Form von JSON zu entpacken, stoßen wir auf diesen Fehler: Dies geschieht, weil xmltodict das JSON mit dem ersten Schlüssel als Wurzel-XML-Tag konstruieren muss. Dies bedeutet, dass es nur einen einzelnen JSON-Schlüssel auf der Wurzelebene der Daten geben sollte.

Schlussfolgerung

In dieser Lektion haben wir ein ausgezeichnetes Python-Modul untersucht, das zum Parsen und Konvertieren von XML in JSON und umgekehrt verwendet werden kann. Wir haben auch gelernt, wie man XML in ein Dictionary mit dem xmltodict-Modul konvertiert. Referenz: API-Dokumentation

Source:
https://www.digitalocean.com/community/tutorials/python-xml-to-json-dict