برلیانس
برلیانس
خواندن ۸ دقیقه·۴ سال پیش

آموزش کار با XML در پایتون

در این مقاله از مجموعه مقاله های آموزش پایتون به بررسی کار با XML در پایتون می پردازیم..

عبارت Extensible Markup Language یا به اختصار XML به معنی زبان نشانه گذاری گسترش پذیر است که یک زبان نشانه گذاری مشابه HTML یا SGML است. کنسرسیوم وب جهان گستر این زبان را به عنوان یک استاندارد سراسری توصیه می کند. چنانچه اپلیکیشنی که قصد طراحی آن را دارید، داده های حجیم و سنگینی برای نگهداری ندارد، در آن صورت می توانید بدون زحمت طراحی دیتابیس و استفاده از پشتوانه ی SQL، اطلاعات برنامه ی خود را در قالب XMLذخیره نمایید.

معماری ها و توابع کتابخانه ای تحلیل گر XML Parser

کتابخانه ی استاندارد python تعدادی interface (الگوی پیاده سازی) معدود اما کارا جهت کار با XML در اختیار برنامه نویس قرار می دهد که در زیر به شرح آن ها می پردازیم. دو API و توابع کتابخانه ای پرکاربرد و ساده ای که توصیه می شود عبارتند از :

  • تابع (SAX (Simple API for XML : در این API، توابع Callback ای برای رخدادهای مورد نظر معرفی (register) می کنید و سپس به parser اجازه می دهید به تحلیل باقی فایل بپردازد. ابزار جاری برای شرایطی مفید می باشد که فایل های اپلیکیشن حجیم بوده و شما با محدودیت حافظه مواجه هستید. در واقع API حاضر فایل را از روی دیسک تحلیل و تفسیر می کند و به همین جهت هیچگاه کل فایل در حافظه بارگذاری نشده و آن را اشغال نمی کند.
  • تابع DOM (Document Object Model) : API جاری را کنسرسیوم وب جهان گستر توصیه می کند. در این API کل محتوای فایل داخل حافظه بارگذاری و به صورت درختی یا سلسله مراتبی سازماندهی می شود و کلیه ی ویژگی های یک فایل XML را به نمایش می گذارد.

تابع SAX قادر نیست هنگام کار با فایل های حجیم، اطلاعات را به سرعت DOM پردازش کند. از طرف دیگر، اگر منحصرا از DOM استفاده کنید، به ویژه برای پردازش فایل های کوچک و کم حجم، قطعا میزان قابل توجهی از منابع شما هدر می رود. SAX فایل ها را با مجوز در سطح فقط خواندن باز می کند، در حالی که DOM امکان اعمال تغییرات در فایل XML را فراهم می آورد. از آنجایی که دو API مزبور مکمل یکدیگر هستند، دلیلی وجود ندارد که از هر دو در پروژه های بزرگ استفاده نکنید. نمونه کدهای XML که در مثال های زیر استفاده کرده و به عنوان ورودی توابع پردازش و parse مورد استفاده قرار می دهیم، فایل movies.xml با محتوای زیر خواهد بود :

< collection shelf=&quotNew Arrivals&quot> < movie title=&quotEnemy Behind&quot> < 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=&quotTransformers&quot> < 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=&quotTrigun&quot> < type>Anime, Action< /type> < format>DVD< /format> < episodes>4< /episodes> < rating>PG< /rating> < stars>10< /stars> < description>Vash the Stampede!< /description> < /movie> < type>Comedy< /type> < format>VHS< /format> < rating>PG< /rating> < stars>2< /stars> < description>Viewable boredom< /description> < /movie> < /collection>

آموزش Python : پردازش و تفسیر XML به وسیله ی توابع SAX

تابع SAX یک interface حاوی مجموعه توابع استاندارد برای تحلیل و پردازش XML به روش رخداد محور (Event-driven) است. جهت استفاده از interface یاد شده برای پردازش و فایل های XML، لازم است با ارث بری (تعریف کلاس مشتق) از xml.sax.ContentHandler، کلاس ContentHandler اختصاصی خود را ایجاد نمایید.

کلاس ContentHandler اختصاصی شما در واقع می تواند تگ ها و attribute های نسخه یا نسخه های مختلف XML را مدیریت نماید. آبجکت ContentHandler تعدادی متد برای مدیریت رخدادهای مختلف parse (پردازش و تحلیل) ارائه می دهد که parser این متدها را به هنگام بارگذاری محتوای فایل XML در حافظه و پردازش آن ها، از ContentHandler فراخوانی می کند.

متدهای startDocument و endDocument هریک به ترتیب در ابتدا و انتهای فایل XML فراخوانی می شوند. اطلاعات و داده های مربوط به کاراکترهای فایل XML از طریق پارامتر text در اختیار متد (character(text قرار می گیرد.

متد ContentHandler در ابتدا و انتهای هر المان فراخوانی می شود. اگر parser در وضعیت namespace mode قرار داشته باشد، در آن صورت متدهای (startElement(tag, attributes و (endElement(tag صدا زده می شوند و در غیر این صورت متدهای مربوطه یعنی startElementNS و endElementNS فراخوانده می شوند. در اینجا منظور از tag در واقع المان tag و attributes، آبجکت Attributes است.

در زیر سایر متدهای مهم که فهم آن ها برای کار با SAX مهم می باشد را مشاهده می کنید :

آموزش برنامه نویسی پایتون : متد make_parser

متد جاری یک آبجکت parser جدید ایجاد کرده و آن را در خروجی برمی گرداند. آبجکت parser که در خروجی بازگردانی می شود، اولین نوع parser است که سیستم پیدا می کند.

xml.sax.make_parser( [parser_list] )

در زیر جزئیات پارامترها به تفصیل شرح داده است :

  • پارامتر parser_list : آرگومان اختیاری متشکل از یک لیست از parser ها برای استفاده که تمامی آن ها بایستی متد make_parser را پیاده سازی می کند.

متد زیر یک مفسر و تحلیل گر نحوی SAX تعریف کرده و با استفاده از آن محتوای فایل مورد نظر را parse (تفسیر و تبدیل) می کند.

xml.sax.parse( xmlfile, contenthandler[, errorhandler])

در زیر اطلاعات پارامترهای متد فوق به تفصیل شرح داده شده است :

  • پارامتر xmlfile : این اسم فایل XML است که محتوای آن قرار است خوانده و تفسیر شود.
  • پارامتر contenthandler : آبجکت ساخته شده از کلاس ContentHandler.
  • این پارامتر اختیاری بوده و در صورت استفاده از آن بایستی یک آبجکت ErrorHandler از SAX باشد.

آموزش زبان پایتون : متد parseString

متد دیگری که یک تحلیل گر و مفسر SAX ایجاد کرده و رشته ی XML ارسالی را parse می کند، parseString می باشد :

xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

در زیر هریک از پارامتر ها به تفصیل شرح داده شده است :

  • پارامتر xmlstring : اسم رشته ی XML که محتوا از آن خوانده می شود.
  • پارامتر contenthandler : بایستی یک آبجکت ContentHandler باشد.
  • پارامتر errorhandler : پارامتر اختیاری که یک آبجکت ErrorHandler از SAX می باشد.

مثال :

#!/usr/bin/python import xml.sax class MovieHandler( xml.sax.ContentHandler ): def __init__(self): self.CurrentData = &quot&quot self.type = &quot&quot self.format = &quot&quot self.year = &quot&quot self.rating = &quot&quot self.stars = &quot&quot self.description = &quot&quot # Call when an element starts def startElement(self, tag, attributes): self.CurrentData = tag if tag == &quotmovie&quot: print &quot*****Movie*****&quot title = attributes[&quottitle&quot] print &quotTitle:&quot, title # Call when an elements ends def endElement(self, tag): if self.CurrentData == &quottype&quot: print &quotType:&quot, self.type elif self.CurrentData == &quotformat&quot: print &quotFormat:&quot, self.format elif self.CurrentData == &quotyear&quot: print &quotYear:&quot, self.year elif self.CurrentData == &quotrating&quot: print &quotRating:&quot, self.rating elif self.CurrentData == &quotstars&quot: print &quotStars:&quot, self.stars elif self.CurrentData == &quotdescription&quot: print &quotDescription:&quot, self.description self.CurrentData = &quot&quot # Call when a character is read def characters(self, content): if self.CurrentData == &quottype&quot: self.type = content elif self.CurrentData == &quotformat&quot: self.format = content elif self.CurrentData == &quotyear&quot: self.year = content elif self.CurrentData == &quotrating&quot: self.rating = content elif self.CurrentData == &quotstars&quot: self.stars = content elif self.CurrentData == &quotdescription&quot: self.description = content if ( __name__ == &quot__main__&quot): # 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(&quotmovies.xml&quot)

خروجی :

*****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

پردازش و تفسیر فایل های XML با استفاده از توابع DOM

مدل شی گرای فایل (Document Object Model) یا به اختصار DOM یک API و مجموع توابع کتابخانه ای است که کنسرسیوم وب جهان گستر برای دسترسی و ویرایش محتوای فایل های XML، به توسعه دهندگان توصیه می کند. DOMبه ویژه برای اپلیکیشن هایی که لازم است به محتوای فایل XML آن به صورت رندوم دسترسی صورت گیرد، مفید می باشد. SAX به توسعه دهنده امکان دسترسی فقط به یک قسمت از فایل XML را در آن واحد می دهد. به طور مثال، هنگام دسترسی به یک المان از فایل XML، امکان دسترسی به سایر المان های فایل برای شما وجود ندارد.

ماژول xml.dom، به شما این امکان را می دهد تا یک آبجکت minidom ایجاد کرده و محتوای فایل XML را به سرعت در حافظه بارگذاری نمایید. آبجکت minidom متد کارا و ساده تری جهت ساخت درخت DOM از فایل XML در اختیار توسعه دهنده قرار می دهد.

نمونه کد زیر متد ([parse(file [,parser از آبجکت minidom را صدا زده و محتوای فایل XML را تجزیه و به آبجکت درخت DOM تبدیل می کند.

#!/usr/bin/python from xml.dom.minidom import parse import xml.dom.minidom # Open XML document using minidom parser DOMTree = xml.dom.minidom.parse(&quotmovies.xml&quot) collection = DOMTree.documentElement if collection.hasAttribute(&quotshelf&quot): print &quotRoot element : %s&quot % collection.getAttribute(&quotshelf&quot) # Get all the movies in the collection movies = collection.getElementsByTagName(&quotmovie&quot) # Print detail of each movie. for movie in movies: print &quot*****Movie*****&quot if movie.hasAttribute(&quottitle&quot): print &quotTitle: %s&quot % movie.getAttribute(&quottitle&quot) type = movie.getElementsByTagName('type')[0] print &quotType: %s&quot % type.childNodes[0].data format = movie.getElementsByTagName('format')[0] print &quotFormat: %s&quot % format.childNodes[0].data rating = movie.getElementsByTagName('rating')[0] print &quotRating: %s&quot % rating.childNodes[0].data description = movie.getElementsByTagName('description')[0] print &quotDescription: %s&quot % 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


با دیگر مقالات آموزش پایتون همراه ما باشید..

آموزش پایتونکار با xml در پایتونآموزش برنامه نویسی پایتونآموزش pythonپردازش فایل های XML با پایتون
شاید از این پست‌ها خوشتان بیاید