سطح مقدماتی (Beginner Level)
فرمت XML (eXtensible Markup Language) یکی از قدیمیترین و رایجترین فرمتها برای تبادل داده بین سیستمها است. در پایتون، کتابخانه استاندارد xml.etree.ElementTree ابزاری قدرتمند و سریع برای کار با این ساختار درختی است.
۱. مفهوم XML و ساختار درختی
دادههای XML به صورت سلسلهمراتبی (درختی) ذخیره میشوند. هر بخش یک Element (گره) است که میتواند شامل متن، ویژگیها (Attributes) و گرههای فرزند باشد.
- Root: گره اصلی که همه چیز درون آن است.
- Tag: نام گره (مثلاً
). - Attribute: اطلاعات اضافه داخل تگ (مثلاً
id="1").
۲. خواندن و تجزیه (Parsing) رشتههای XML
سادهترین روش برای کار با XML، خواندن آن از یک رشته (String) است. تابع fromstring ساختار متنی را به یک شیء Element تبدیل میکند.
# Example 2: Static snippet (Conceptual)
# اگر فایل XML واقعی داشته باشید:
import xml.etree.ElementTree as ET
tree = ET.parse('data.xml')
root = tree.getroot()
۳. جستجو در عناصر (Finding Elements)
برای پیدا کردن تگهای خاص درون درخت XML، از متدهای find (اولین مورد)، findall (همه موارد) و findtext (متن داخل تگ) استفاده میکنیم.
سطح پیشرفته (Professional Level)
در سطح حرفهای، بحث بر سر ساخت XMLهای پیچیده، ویرایش فایلهای موجود، مدیریت Namespaceها و مهمتر از همه، امنیت در پردازش XML است.
۱. ساخت و ویرایش XML (Building & Modifying)
شما میتوانید با استفاده از کلاس Element و SubElement یک ساختار XML را از صفر بسازید و یا گرههای موجود را تغییر دهید.
۲. پشتیبانی از XPath
ماژول ElementTree از یک زیرمجموعه محدود از زبان XPath پشتیبانی میکند که امکان جستجوی بسیار دقیقتر (مثلاً بر اساس مقدار Attribute) را میدهد.
# Example 2: Static XPath Logic
# [@attrib] -> عناصری که این ویژگی را دارند
# [tag] -> عناصری که فرزندی با این نام دارند
# .//tag -> جستجو در تمام سطوح (Recursive)
items = root.findall(".//item[@status='active']")
۳. امنیت در XML (جلوگیری از حملات)
نکته حیاتی: کتابخانه استاندارد xml.etree در برابر حملات مخرب XML ایمن نیست. حملاتی مانند Billion Laughs (بمب XML) یا External Entity Expansion (XXE) میتوانند باعث مصرف تمام حافظه یا افشای فایلهای سرور شوند.
برای محیطهای عملیاتی (Production) که XML را از کاربران دریافت میکنید، حتماً از کتابخانه defusedxml استفاده کنید.
# Example 1: Vulnerable Code (Do NOT use with untrusted input)
# این کد در برابر فایلهای مخرب آسیبپذیر است
import xml.etree.ElementTree as ET
# tree = ET.parse('untrusted_file.xml') # خطرناک
۴. کار با فایلهای حجیم (iterparse)
وقتی فایل XML بسیار بزرگ است (چند گیگابایت)، بارگذاری کل آن در حافظه (RAM) با parse ممکن نیست. در این شرایط از iterparse استفاده میکنیم که فایل را به صورت جریانی (Stream) میخواند.
# Example 1: Efficient Memory Usage (Static)
import xml.etree.ElementTree as ET
def process_large_xml(filename):
# رویداد 'end' یعنی وقتی تگ بسته شد پردازش کن
context = ET.iterparse(filename, events=("end",))
for event, elem in context:
if elem.tag == "record":
# پردازش داده
print(elem.text)
# بسیار مهم: حذف ارجاع برای خالی کردن حافظه
elem.clear()