Vandaag zullen we leren hoe we XML naar JSON en XML naar een dictionary kunnen converteren in Python. We kunnen de Python-module xmltodict
gebruiken om een XML-bestand te lezen en het om te zetten naar een dictionary of JSON-gegevens. We kunnen ook grote XML-bestanden streamen en ze omzetten naar een dictionary. Voordat we naar het gedeelte met de code gaan, laten we eerst begrijpen waarom XML-conversie noodzakelijk is.
XML naar Dict/JSON converteren
XML-bestanden zijn langzaam verouderd, maar er zijn nog steeds behoorlijk grote systemen op het web die dit formaat gebruiken. XML is zwaarder dan JSON en daarom geven de meeste ontwikkelaars de voorkeur aan het laatste in hun toepassingen. Wanneer toepassingen de XML van een bron moeten begrijpen, kan het een tijdrovende taak zijn om deze om te zetten naar JSON. De xmltodict
-module in Python maakt deze taak uiterst eenvoudig en rechttoe rechtaan.
Aan de slag met xmltodict
We kunnen aan de slag met de xmltodict
-module, maar we moeten deze eerst installeren. We zullen voornamelijk pip gebruiken om de installatie uit te voeren.
Installeer de xmltodict-module
Hier is hoe we de xmltodict-module kunnen installeren met behulp van Python Package Index (pip):
pip install xmltodict
Dit zal snel worden gedaan omdat xmltodict
een zeer lichte module is. Hier is de uitvoer voor deze installatie: Het beste van deze installatie was dat deze module niet afhankelijk is van enige andere externe module en daarom lichtgewicht is en eventuele versieconflicten vermijdt. Gewoon ter illustratie, op op Debian gebaseerde systemen kan deze module gemakkelijk worden geïnstalleerd met behulp van het
apt
-hulpprogramma:
sudo apt install python-xmltodict
Nog een pluspunt is dat deze module een officiële Debian-pakket heeft.
Python XML naar JSON
De beste plek om te beginnen met het proberen van deze module is om een operatie uit te voeren waarvoor deze hoofdzakelijk is gemaakt, namelijk XML naar JSON-conversies uitvoeren. Laten we eens kijken naar een codefragment over hoe dit kan worden gedaan:
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)))
Laten we de output voor dit programma bekijken: Hier gebruiken we eenvoudig de `parse(…)` functie om XML-gegevens naar JSON te converteren en vervolgens gebruiken we de `json` module om JSON op een betere manier af te drukken.
XML-bestand converteren naar JSON
Het bewaren van XML-gegevens in de code zelf is niet altijd mogelijk noch realistisch. Meestal bewaren we onze gegevens in een database of in enkele bestanden. We kunnen ook rechtstreeks bestanden selecteren en ze naar JSON converteren. Laten we eens kijken naar een codefragment hoe we de conversie met een XML-bestand kunnen uitvoeren:
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))
Laten we de output voor dit programma bekijken: Hier gebruikten we nog een andere module pprint om de uitvoer op een geformatteerde manier af te drukken. Afgezien daarvan was het gebruik van de `open(…)` functie eenvoudig, we gebruikten het om een bestandsdescriptor te krijgen en vervolgens het bestand te parseren naar een JSON-object.
Python XML naar Dict
Zoals de modulenaam zelf suggereert, converteert xmltodict eigenlijk de XML-gegevens die we verstrekken naar slechts een eenvoudige Python-dictionary. Dus, we kunnen eenvoudig toegang krijgen tot de gegevens met de dictionary-sleutels ook. Hier is een voorbeeldprogramma:
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'])
Laten we de uitvoer voor dit programma bekijken: Dus, de tags kunnen worden gebruikt als de sleutels samen met de attribuutsleutels ook. De attribuutsleutels moeten alleen worden voorafgegaan door het symbool
@
.
Ondersteuning van namespaces in XML
In XML-gegevens hebben we meestal een set namespaces die het bereik van de gegevens gedefinieerd door het XML-bestand bepalen. Bij het converteren naar het JSON-formaat is het dan noodzakelijk dat deze namespaces ook in het JSON-formaat behouden blijven. Laten we dit voorbeeld XML-bestand overwegen:
<root xmlns="https://defaultns.com/"
xmlns:a="https://a.com/">
<audience>
<id what="attribute">123</id>
<name>Shubham</name>
</audience>
</root>
Hier is een voorbeeldprogramma over hoe we XML-namespaces kunnen opnemen in het JSON-formaat:
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))
Laten we de uitvoer voor dit programma bekijken:
JSON naar XML-conversie
Hoewel het omzetten van XML naar JSON het belangrijkste doel is van deze module, ondersteunt xmltodict ook de omgekeerde bewerking, namelijk het omzetten van JSON naar XML-formaat. We zullen de JSON-gegevens zelf in het programma verstrekken. Hier is een voorbeeldprogramma:
import xmltodict
student = {
"data" : {
"name" : "Shubham",
"marks" : {
"math" : 92,
"english" : 99
},
"id" : "s387hs3"
}
}
print(xmltodict.unparse(student, pretty=True))
Laten we de uitvoer voor dit programma bekijken: Let op dat het opgeven van een enkele JSON-sleutel noodzakelijk is voor correcte werking. Als we overwegen om ons programma aan te passen om meerdere JSON-sleutels te bevatten op het allereerste niveau van de gegevens, zoals:
import xmltodict
student = {
"name" : "Shubham",
"marks" : {
"math" : 92,
"english" : 99
},
"id" : "s387hs3"
}
print(xmltodict.unparse(student, pretty=True))
In dit geval hebben we drie sleutels op het hoofdniveau. Als we proberen dit JSON-formaat te ontleden, krijgen we deze foutmelding: Dit gebeurt omdat xmltodict de JSON moet construeren met de allereerste sleutel als de hoofd XML-tag. Dit betekent dat er slechts één JSON-sleutel moet zijn op het hoofdniveau van de gegevens.
Conclusie
In deze les hebben we een uitstekende Python-module bestudeerd die kan worden gebruikt om XML naar JSON en omgekeerd te analyseren en om te zetten. We hebben ook geleerd hoe XML naar Dict kan worden omgezet met behulp van de xmltodict-module. Referentie: API Doc
Source:
https://www.digitalocean.com/community/tutorials/python-xml-to-json-dict