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

آموزش کار با 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="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>
< 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 = ""
      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()
   # tu 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

 

آموزش Python : پردازش و تفسیر فایل های 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("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

 

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

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

نویسنده : پیمان کلانتری بازدید : 228 تاريخ : پنجشنبه 22 آبان 1399 ساعت: 23:06