پردازش XML در پایتون
در این آموزش از کتاب برخط پایتون، نحوه parse و پردازش XML توسط زبان برنامه نویسی پایتون را با استفاده از API های DOM و SAX را نشان خواهیم داد. XML یک زبان قابل حمل (Portable) و متن باز است که به برنامه نویسان این امکان را می دهد تا برنامه های خود را توسعه دهند به طوری که این برنامه ها قابلیت خوانده شدن توسط برنامه های دیگر را داشته باشد، بدون در نظر گرفتن آنکه سیستم عامل و یا زبان برنامه نویسی مورد نظر چه خواهد بود.
XML چیست؟
XML مخفف Extensible Markup Language می باشد، که یک زبان نشانه گذاری مانند HTML یا SGML است. XML برای کار با داده های کم تا متوسط بدون نیاز به SQL بسیار کاربرد دارد.
معماری های XML Parser و API ها
کتابخانه استاندارد پایتون رابط های مختصر ولی مفیدی برای کار با XML فراهم کرده است.
دو تا از پایه ای ترین و از نظر استفاده گسترده ترین API ها برای داده XML رابط های SAX و DOM هستند.
- SAX مخفف Simple API for XML: در اینجا، شما فراخوان هایی را برای رخدادهای مورد نظر ثبت می کنید و سپس به parser اجازه می دهید درون سند حرکت کند. این حالت زمانیکه سندهای شما خیلی بزرگ هستند و یا محدودیت حافظه دارید سودمند می باشد. در این حالت فایل های خوانده شده از دیسک parse می شوند و کل فایل هرگز در حافظه ذخیره نمی شود.
- DOM مخفف Document Object Model: این API توصیه ی کنسرسیوم World Wide Web می باشد و اینگونه است که تمام فایل از حافظه خوانده شده و در یک فرم سلسله مراتبی (hierarchical) و درختی برای نمایش تمام ویژگی های سند XML ذخیره می شود.
واضح است که SAX نمی تواند پردازش اطلاعات در فایل های بزرگ را به همان سرعتی که DOM انجام می دهد، انجام دهد. از طرف دیگر، استفاده از DOM می تواند به طور جدی منابع شما را نابود کند، بخصوص اگر با فایل های کوچک با تعداد بالا کار می کنید.
Sax فقط خواندی است، در حالیکه DOM اجازه تغییرات در فایل XML را به شما می دهد. با توجه به اینکه این دو API متفاوت کاملا کامل کننده یکدیگر می باشند، دلیل ندارد که شما نتوانید از هردوی آن ها برای پروژه های بزرگ استفاده کنید.
در تمامی مثال های این آموزش، اجازه دهید از فایل XML ساده movies.xml زیر به عنوان ورودی استفاده کنیم:
<collection shelf = "New Arrivals">
<movie title = "Enemy Behind">
<type>War, Thriller</type>
<format>DVD</format>
<year>2003</year>
<rating>PG</rating>
<stars>10</stars>
<description>Talk about a US-Japan war</description>
</movie>
<movie title = "Transformers">
<type>Anime, Science Fiction</type>
<format>DVD</format>
<year>1989</year>
<rating>R</rating>
<stars>8</stars>
<description>A schientific fiction</description>
</movie>
<movie title = "Trigun">
<type>Anime, Action</type>
<format>DVD</format>
<episodes>4</episodes>
<rating>PG</rating>
<stars>10</stars>
<description>Vash the Stampede!</description>
</movie>
<movie title = "Ishtar">
<type>Comedy</type>
<format>VHS</format>
<rating>PG</rating>
<stars>2</stars>
<description>Viewable boredom</description>
</movie>
</collection>
parse کردن XML با SAX
SAX یک رابط استاندارد برای parse کردن XML به صورت رویداد محور (event-driven) است. پردازش XML با استفاده از SAX به طور معمول نیاز به ایجاد ContentHandler شما توسط xml.sax.ContentHandler خواهد داشت.
ContentHandler شما تگ های خاص و attribute هایی XML شما را کنترل می کند. یک شیء ContentHandler متدهایی برای کنترل رویدادهای مختلفی را فراهم می کند. متدهای startDocument و endDocument در شروع و پایان فایل XML فراخوانی می شوند. متد characters(text) داده کاراکتر فایل XML توسط پارامتر text ارسال می کند.
ContentHandler در شروع و پایان هر المان (element) فراخوانی می شود. در صورتی که parser در مُد namespace نباشد، متد های startElement(tag, attributes) و endElement(tag) فراخوانی می شوند، در غیر اینصورت، متدهای متناظر startElementNS و endElementNS فراخوانی می شوند. در اینجا، tag المان تگ می باشد، و attributes یک شیء Attribute می باشد.
متد make_parser
متد زیر یک شیء جدید parser ایجاد کرده و آن را برمیگرداند. آبجکت parser ایجاد شده اولین نوع parser خواهد بود که سیستم پیدا می کند.
xml.sax.make_parser( [parser_list] )
در زیر جزئیات پارامترها را مشاهده می کنید
متد parse
این متد یک SAX parser را ایجاد کرده و از آن برای parse کردن یک سند استفاده می کند.
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
در زیر جزئیات پارامترها را مشاهده می کنید:
متد parseString
یک متد دیگر برای ایجاد یک SAX parser و همچنین parse رشته XML تعیین شده وجود دارد.
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
در زیر جزئیات پارامترها را مشاهده می کنید:
مثال:
#!/usr/bin/python3
import xml.sax
class MovieHandler( xml.sax.ContentHandler ):
def __init__(self):
self.CurrentData = ""
self.type = ""
self.format = ""
self.year = ""
self.rating = ""
self.stars = ""
self.description = ""
# Call when an element starts
def startElement(self, tag, attributes):
self.CurrentData = tag
if tag == "movie":
print ("*****Movie*****")
title = attributes["title"]
print ("Title:", title)
# Call when an elements ends
def endElement(self, tag):
if self.CurrentData == "type":
print ("Type:", self.type)
elif self.CurrentData == "format":
print ("Format:", self.format)
elif self.CurrentData == "year":
print ("Year:", self.year)
elif self.CurrentData == "rating":
print ("Rating:", self.rating)
elif self.CurrentData == "stars":
print ("Stars:", self.stars)
elif self.CurrentData == "description":
print ("Description:", self.description)
self.CurrentData = ""
# Call when a character is read
def characters(self, content):
if self.CurrentData == "type":
self.type = content
elif self.CurrentData == "format":
self.format = content
elif self.CurrentData == "year":
self.year = content
elif self.CurrentData == "rating":
self.rating = content
elif self.CurrentData == "stars":
self.stars = content
elif self.CurrentData == "description":
self.description = content
if ( __name__ == "__main__"):
# create an XMLReader
parser = xml.sax.make_parser()
# turn off namepsaces
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
# override the default ContextHandler
Handler = MovieHandler()
parser.setContentHandler( Handler )
parser.parse("movies.xml")
خروجی:
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2003
Rating: PG
Stars: 10
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Description: Viewable boredom
parse یا پردازش XML با DOM
DOM یا Document Object Model یک API مستقل از زبان از کنسرسیوم World Wide Web یا W3C می باشد که برای دسترسی و ویرایش مستندات XML به کار می رود.
DOM برای برنامه های با دسترسی تصادفی (random-access) بسیار سودمند می باشد. SAX تنها اجازه دیدن یک بیت از سند را در یک زمان ان به شما می دهد. در صورتی که یک المان را در SAX مشاهده می کنید، به المان های دیگر دسترسی ندارید.
در اینجا ساده ترین راه برای بارگذاری سریع یک سند XML و ایجاد یک شیء minidom با استفاده از ماژول xml.dom است. شیء minidom یک روش ساده parser است که یک درخت DOM از فایل XML ایجاد می کند.
مثال
#!/usr/bin/python3
from xml.dom.minidom import parse
import xml.dom.minidom
# Open XML document using minidom parser
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
print ("Root element : %s" % collection.getAttribute("shelf"))
# Get all the movies in the collection
movies = collection.getElementsByTagName("movie")
# Print detail of each movie.
for movie in movies:
print ("*****Movie*****")
if movie.hasAttribute("title"):
print ("Title: %s" % movie.getAttribute("title"))
type = movie.getElementsByTagName('type')[0]
print ("Type: %s" % type.childNodes[0].data)
format = movie.getElementsByTagName('format')[0]
print ("Format: %s" % format.childNodes[0].data)
rating = movie.getElementsByTagName('rating')[0]
print ("Rating: %s" % rating.childNodes[0].data)
description = movie.getElementsByTagName('description')[0]
print ("Description: %s" % description.childNodes[0].data)
خروجی
Root element : New Arrivals
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Rating: PG
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Rating: R
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Description: Viewable boredom