היום נלמד כיצד להמיר XML ל-JSON ו-XML למילון בפייתון. נוכל להשתמש במודול xmltodict
בפייתון כדי לקרוא קובץ XML ולהמיר אותו למילון או לנתוני JSON. נוכל גם לעבור על קבצי XML גדולים ולהמיר אותם למילון. לפני שנתעקל על חלק הקידוד, בואו נבין למה המרת XML היא נחוצה.
המרת XML למילון/JSON
קבצי XML החלו להתגבש במהירות, אך עדיין ישנם מערכות גדולות ברשת המשתמשות עדיין בפורמט זה. XML היא כבדה יותר מ-JSON ולכן רוב המפתחים מעדיפים את האחרון ביישומיהם. כאשר יישומים צריכים להבין את ה-XML שסופק על ידי כל מקור, יכול להיות משימה מטרידה להמיר אותו ל-JSON. מודול ה-xmltodict
בפייתון הופך את המשימה הזו לקלה מאוד וישירה לביצוע.
התחלה עם xmltodict
נוכל להתחיל עם מודול xmltodict
אך נצטרך להתקין אותו תחילה. נשתמש בעיקר ב-pip כדי לבצע את ההתקנה.
התקן את מודול xmltodict
כך ניתן להתקין את מודול xmltodict באמצעות Python Package Index (pip):
pip install xmltodict
פעולה זו תבוצע מהר מאוד מאחר ו־xmltodict
הוא מודול קל מאוד. הנה הפלט של ההתקנה: הדבר הטוב ביותר בהתקנה זו הוא שהמודול אינו תלוי במודול חיצוני נוסף ולכן הוא קל משקל וממנע התנגשויות גרסאות. רק להדגמה, במערכות המבוססות על Debian, ניתן להתקין את המודול בקלות באמצעות הכלי
apt
:
sudo apt install python-xmltodict
עוד יתרון הוא שיש למודול זה חבילה רשמית של Debian.
Python XML to 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
שמירת הנתונים בקוד עצמו אינה תמיד אפשרית וגם אינה ריאלית. כללית, אנו שומרים את הנתונים שלנו בבסיס נתונים או בקבצים מסוימים. אנו יכולים לבחור קבצים ישירות ולהמיר אותם ל-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 למילון
כפי ששמו של המודול מרמז, xmltodict ממיר אכן את הנתונים XML שאנו מספקים לתוך מילון פיתון פשוט. לכן, נוכל פשוט לגשת לנתונים עם מפתחות המילון גם. הנה דוגמה לתוכנית:
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>
הנה דוגמה לתוכנית על איך שאנו יכולים לכלול מרחבי שמות XML גם בתבנית JSON:
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 מתוך תבנית זו של JSON, נתקל בשגיאה זו: זה קורה מכיוון ש-xmltodict צריך לבנות את ה-JSON עם המפתח הראשון בתור התג XML שורש. כלומר, יש להיות מפתח JSON יחיד ברמת השורש של הנתונים.
מסקנה
בשיעור זה, למדנו על מודול Python מצויין שניתן להשתמש בו כדי לנתח ולהמיר XML ל-JSON ולהיפך. למדנו גם כיצד להמיר XML למילון באמצעות מודול xmltodict. הפנייה: מסמך API
Source:
https://www.digitalocean.com/community/tutorials/python-xml-to-json-dict