איך לקרוא ולכתוב קבצי XML ב Python עם ElementTree
המודול ElementTree הוא חלק מהספריה הסטנדרטית של פייתון עוד מאז גירסה 2.5. הוא נחשב קל יותר ויעיל יותר בהשוואה ל xml.dom.minidom. בואו נראה איך להשתמש בו בעזרת שלוש דוגמאות פשוטות.
1. יצירת מסמך XML מתוך קוד פייתון
תוכנית ראשונה לוקחת קוד פייתון ויוצרת מסמך XML שמתאים לו. נתחיל עם הקוד:
import xml.etree.ElementTree as ET
root = ET.Element('items')
for item in ['one', 'two', 'three']:
child = ET.SubElement(root, item)
child.set('length', str(len(item)))
ET.dump(root)
אחרי יבוא המודול הפונקציה ET.Element
יוצרת אלמנט ב XML, והפונקציה ET.SubElement
יוצרת אלמנט ילד בתוך אלמנט אחר. הפונקציה set
של אלמנט מגדירה ערך ל Attribute. סך הכל הקוד מדפיס את מסמך ה XML הבא:
<items><one length="3" /><two length="3" /><three length="5" /></items>
כדי לכתוב את המסמך לקובץ אפשר להשתמש בפונקציה write
של אלמנט:
root.write('input.xml')
2. קריאת מסמך XML מלא
אחרי שכתבנו את הקובץ אפשר להתקדם לתוכנית שניה שתקרא אותו ותדפיס את שלושת האלמנטים ממנו. התוכנית משתמשת באותו ElementTree רק שהפעם הלולאה תהיה על האלמנט. הנה הקוד:
import xml.etree.ElementTree as ET
doc = ET.parse('input.xml')
root = doc.getroot()
for child in root:
print(f'"{child.text}" has length {child.attrib["length"]}')
ב ElementTree האלמנטים מתנהגים כמו אוביקטים רגילים של פייתון - אפשר לרוץ בלולאה על אלמנט כדי לקבל את כל הילדים שלו, אפשר לפנות לאלמנט באינדקס מסוים כדי לקבל ילד ספציפי, ואפשר לגשת למאפיין attrib
כדי לקבל את כל ה Attributes או ל text
כדי לקבל את הטקסט של האלמנט.
3. חיפוש במסמך XML בעזרת XPath
פיצ'ר מדליק נוסף של ElementTree הוא התמיכה ב XPath, שמאפשרת חיפוש של אלמנטים ספציפיים בעץ. בדוגמה הבאה אני רוצה למצוא את כל האלמנטים שמאפיין length שלהם הוא 3, כלומר את האלמנטים one ו two. הנה הקוד:
import xml.etree.ElementTree as ET
doc = ET.parse('input.xml')
for child in doc.findall("./*[@length='3']"):
print(child.text)
הפונקציה findall
מקבלת שאילתת xpath ומחזירה רשימה של תוצאות. אם אתם לא בטוחים איך קוראים את ה XPath אז בקישור הזה יש דף קיצורים נחמד שמסביר על כל התחביר.
למידע נוסף ועוד דוגמאות על ElementTree שווה גם לבדוק את תיעוד המודול בתיעוד של פייתון בקישור: https://docs.python.org/3/library/xml.etree.elementtree.html