איך לקרוא ולכתוב קבצי XML ב Python עם ElementTree

17/01/2023

המודול 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