آموزش پردازش XML در برنامه نویسی پایتون 3
آموزش پردازش XML در برنامه نویسی پایتون 3
در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، به آموزش پردازش XML در برنامه نویسی پایتون 3 خواهیم پرداخت.
پیشنهاد ویژه : پکیج آموزش طراحی وب سایت با پایتون
XML یک زبان متن باز و قابل حمل است که به برنامه نویسان اجازه می دهد بدون توجه به سیستم عامل و/یا زبان توسعه، برنامه هایی را توسعه دهند که توسط سایر برنامه ها قابل خواندن باشد.
XML چیست؟
زبان نشانه گذاری توسعه پذیر (XML) یک زبان نشانه گذاری بسیار شبیه به HTML یا SGML است. این توسط کنسرسیوم وب جهانی توصیه شده و به عنوان یک استاندارد باز در دسترس است.
XML برای ردیابی مقادیر کوچک تا متوسط داده بدون نیاز به ستون فقرات مبتنی بر SQL بسیار مفید است.
XML Parser Architectures و APIs
کتابخانه استاندارد پایتون مجموعه ای کمینه اما مفید از رابط ها را برای کار با XML فراهم می کند.
دو پایه ای ترین و پرکاربردترین API برای داده های XML، رابط های SAX و DOM هستند.
- API ساده برای XML (SAX) – در اینجا، شما برای رویدادهای مورد علاقه تماسهای برگشتی را ثبت میکنید و سپس به تجزیهکننده اجازه میدهید تا از طریق سند ادامه دهد. این زمانی مفید است که اسناد شما بزرگ هستند یا محدودیت حافظه دارید، فایل را با خواندن آن از روی دیسک تجزیه می کند و کل فایل هرگز در حافظه ذخیره نمی شود.
- Document Object Model (DOM) API – این یک توصیه کنسرسیوم وب جهانی است که در آن کل فایل در حافظه خوانده می شود و در یک فرم سلسله مراتبی (مبتنی بر درخت) ذخیره می شود تا تمام ویژگی های یک سند XML را نشان دهد.
واضح است که SAX هنگام کار با فایل های بزرگ نمی تواند اطلاعات را به سرعت DOM پردازش کند. از سوی دیگر، استفاده انحصاری از DOM واقعاً می تواند منابع شما را از بین ببرد، به خصوص اگر در بسیاری از فایل های کوچک استفاده شود.
SAX فقط خواندنی است، در حالی که DOM اجازه تغییرات در فایل XML را می دهد. از آنجایی که این دو API مختلف به معنای واقعی کلمه مکمل یکدیگر هستند، دلیلی وجود ندارد که نتوانید از هر دو آنها برای پروژه های بزرگ استفاده کنید.
برای همه نمونههای کد XML، اجازه دهید از یک فایل XML ساده movies.xml به عنوان ورودی استفاده کنیم –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<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> |
SAX یک رابط استاندارد برای تجزیه XML مبتنی بر رویداد است. تجزیه XML با SAX عموماً مستلزم ایجاد ContentHandler خود با زیر کلاس بندی xml.sax.ContentHandler است.
ContentHandler شما برچسب ها و ویژگی های خاص طعم(های) XML شما را کنترل می کند. یک شی ContentHandler روش هایی را برای مدیریت رویدادهای تجزیه مختلف ارائه می دهد. تجزیه کننده مالک آن با تجزیه فایل XML متدهای ContentHandler را فراخوانی می کند.
متدهای startDocument و endDocument در ابتدا و انتهای فایل XML فراخوانی می شوند. کاراکترهای متد (متن) داده های کاراکتر فایل XML از طریق متن پارامتر ارسال می شود.
ContentHandler در ابتدا و انتهای هر عنصر فراخوانی می شود. اگر تجزیه کننده در حالت فضای نام نباشد، متدهای startElement(tag، ویژگی ها) و endElement(tag) فراخوانی می شوند. در غیر این صورت متدهای مربوطه startElementNS و endElementNS فراخوانی می شوند. در اینجا، تگ تگ عنصر است و ویژگی ها یک شیء Attributes است.
در اینجا روشهای مهم دیگری برای درک قبل از ادامه وجود دارد
روش make_parser
متد زیر یک شی تجزیه کننده جدید ایجاد می کند و آن را برمی گرداند. شی تجزیه کننده ایجاد شده از اولین نوع تجزیه کننده خواهد بود که سیستم می یابد.
1 |
xml.sax.make_parser( [parser_list] ) |
در اینجا جزئیات پارامترها آمده است –
parser_list – آرگومان اختیاری متشکل از لیستی از تجزیه کننده ها برای استفاده که همگی باید متد make_parser را پیاده سازی کنند.
روش parser
روش زیر یک تجزیه کننده SAX ایجاد می کند و از آن برای تجزیه یک سند استفاده می کند.
1 |
xml.sax.parse( xmlfile, contenthandler[, errorhandler]) |
در اینجا جزئیات پارامترها آمده است –
- xmlfile – این نام فایل XML برای خواندن است.
- contenthandler – این باید یک شی ContentHandler باشد.
- errorhandler – اگر مشخص شده باشد، errorhandler باید یک شی SAX ErrorHandler باشد.
روش parseString
یک روش دیگر برای ایجاد تجزیه کننده SAX و تجزیه رشته XML مشخص شده وجود دارد.
1 |
xml.sax.parseString(xmlstring, contenthandler[, errorhandler]) |
در اینجا جزئیات پارامترها آمده است –
- xmlstring – این نام رشته XML برای خواندن است.
- contenthandler – این باید یک شی ContentHandler باشد.
- errorhandler – اگر مشخص شده باشد، errorhandler باید یک شی SAX ErrorHandler باشد.
مثال
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
#!/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") |
خروجی
این نتیجه زیر را ایجاد می کند –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
*****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 scientific 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 |
تجزیه XML با API های DOM
Document Object Model (“DOM”) یک API بین زبانی از کنسرسیوم جهانی وب (W3C) برای دسترسی و اصلاح اسناد XML است.
DOM برای برنامه های کاربردی با دسترسی تصادفی بسیار مفید است. SAX فقط به شما اجازه می دهد یک بیت از سند را در یک زمان مشاهده کنید. اگر به یک عنصر SAX نگاه می کنید، به دیگری دسترسی ندارید.
در اینجا ساده ترین راه برای بارگذاری سریع یک سند XML و ایجاد یک شی minidom با استفاده از ماژول xml.dom وجود دارد. شی minidom یک روش تجزیه کننده ساده ارائه می دهد که به سرعت یک درخت DOM از فایل XML ایجاد می کند.
عبارت نمونه تابع parse( file [,parser] ) شی minidom را برای تجزیه فایل XML که توسط فایل به یک شی درختی DOM تعیین شده است فراخوانی می کند.
مثال
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#!/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) Output |
این نتیجه زیر را ایجاد می کند –
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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 scientific 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 |
لیست جلسات قبل آموزش برنامه نوبسی پایتون 3
- آموزش برنامه نویسی پایتون 3
- آموزش موارد جدید در برنامه نویسی پایتون 3
- آموزش مرور کلی برنامه نویسی پایتون 3
- آموزش راه اندازی محیط برنامه نویسی پایتون 3
- آموزش نحو در برنامه نویسی پایتون 3
- آموزش انواع متغیرها در برنامه نویسی پایتون 3
- آموزش عملگرهای پایه در برنامه نویسی پایتون 3
- آموزش تصمیم گیری در برنامه نویسی پایتون 3
- آموزش حلقه ها در برنامه نویسی پایتون 3
- آموزش اعداد در برنامه نویسی پایتون 3
- آموزش رشته ها در برنامه نویسی پایتون 3
- آموزش لیست ها در برنامه نویسی پایتون 3
- آموزش تاپل ها در برنامه نویسی پایتون 3
- آموزش دیکشنری در برنامه نویسی پایتون 3
- آموزش تاریخ و زمان در برنامه نویسی پایتون 3
- آموزش توابع در برنامه نویسی پایتون 3
- آموزش ماژول ها در برنامه نویسی پایتون 3
- آموزش فایل های ورودی/خروجی در برنامه نویسی پایتون 3
- آموزش مدیریت استثنا در برنامه نویسی پایتون 3
- آموزش شی گرایی در برنامه نویسی پایتون 3
- آموزش عبارات منظم در برنامه نویسی پایتون 3
- آموزش CGI در برنامه نویسی پایتون 3
- آموزش دسترسی به پایگاه داده MySQL در برنامه نویسی پایتون 3
- آموزش برنامه نویسی شبکه در برنامه نویسی پایتون 3
- آموزش ارسال ایمیل با استفاده از SMTP در برنامه نویسی پایتون 3
- آموزش برنامه نویسی چند رشته ای در برنامه نویسی پایتون 3
دیدگاه شما