شنبه ۲۹ دي ۱۴۰۳
Tut24 آموزش برنامه نویسی و مجله تخصصی فناوری ورود/عضویت

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

XML یک زبان منبع باز و قابل حمل است که به برنامه نویسان اجازه می دهد برنامه هایی را توسعه دهند که می توانند توسط سایر برنامه ها خوانده شوند، صرف نظر از سیستم عامل و یا زبان توسعه.

XML چیست؟

زبان علامت گذاری قابل گسترش (XML) یک زبان علامت گذاری شبیه HTML یا SGML است. این توسط کنسرسیوم جهانی وب توصیه شده و به عنوان یک استاندارد باز در دسترس است.

XML برای ردیابی داده های کوچک تا متوسط ​​بدون نیاز به پشته SQL بسیار مفید است.

معماری ها و API های تجزیه XML

کتابخانه استاندارد پایتون یک مجموعه حداقل اما مفید از رابط ها را برای کار با XML فراهم می کند.

دو API پایه ای و گسترده ترین برای داده های XML رابط های SAX و DOM هستند.

  • رابط ساده برای XML (SAX) − در اینجا، شما 콜 back ها را برای رویدادهای مورد علاقه ثبت می کنید و سپس اجازه می دهید پردازشگر از طریق سند ادامه دهد. این زمانی مفید است که اسناد شما بزرگ هستند یا محدودیت های حافظه دارید، آن را به عنوان آن را از دیسک می خواند و کل پرونده هرگز در حافظه ذخیره نمی شود.

  • رابط مدل شیء سند (DOM) − این یک توصیه کنسرسیوم جهانی وب است که در آن کل فایل در حافظه خوانده می شود و به شکل سلسله مراتبی (مبتنی بر درخت) ذخیره می شود تا همه ویژگی های یک سند XML را نشان دهد.

SAX obviously نمی تواند اطلاعات را به سرعت DOM پردازش کند وقتی با فایل های بزرگ کار می کند. از سوی دیگر، استفاده از DOM به طور انحصاری می تواند واقعاً منابع شما را از بین ببرد، به خصوص اگر در تعداد زیادی فایل کوچک استفاده شود.

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

برای همه مثال های کد XML ما، بیایید از یک فایل XML ساده movies.xml به عنوان ورودی استفاده کنیم −

pre class="language-markup"> <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>

تجزیه XML با API های SAX

SAX یک رابط استاندارد برای تجزیه XML بر اساس رویداد است. تجزیه XML با SAX به طور کلی نیاز دارد که شما ContentHandler خود را با زیرمجموعه xml.sax.ContentHandler ایجاد کنید.

ContentHandler شما برچسب ها و ویژگی های خاص طعم XML شما را مدیریت می کند. یک شی ContentHandler روش هایی را برای مدیریت رویدادهای مختلف تجزیه فراهم می کند. پردازنده مالک آن به عنوان آن را فایل XML را تجزیه می کند، روش های ContentHandler را فراخوانی می کند.

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

ContentHandler در ابتدای و انتهای هر عنصر فراخوانی می شود. اگر پردازشگر در حالت نام miền نیست، روش های startElement(tag, attributes) و endElement(tag) فراخوانی می شوند؛ در غیر این صورت، روش های مربوطه startElementNS و endElementNS فراخوانی می شوند. در اینجا، برچسب برچسب عنصر است و attributes یک شی Attributes است.

در اینجا سایر روش های مهمی که باید قبل از ادامه کار درک شوند آورده شده است −

روش make_parser

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


xml.sax.make_parser( [parser_list] )

تجزیه XML با API های SAX

SAX یک رابط استاندارد برای تجزیه XML بر اساس رویداد است. تجزیه XML با SAX به طور کلی نیاز دارد که شما ContentHandler خود را با زیرمجموعه xml.sax.ContentHandler ایجاد کنید.

ContentHandler شما برچسب ها و ویژگی های خاص طعم XML شما را مدیریت می کند. یک شی ContentHandler روش هایی را برای مدیریت رویدادهای مختلف تجزیه فراهم می کند. پردازنده مالک آن به عنوان آن را فایل XML را تجزیه می کند، روش های ContentHandler را فراخوانی می کند.

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

ContentHandler در ابتدای و انتهای هر عنصر فراخوانی می شود. اگر پردازشگر در حالت نام miền نیست، روش های startElement(tag, attributes) و endElement(tag) فراخوانی می شوند؛ در غیر این صورت، روش های مربوطه startElementNS و endElementNS فراخوانی می شوند. در اینجا، برچسب برچسب عنصر است و attributes یک شی Attributes است.

در اینجا سایر روش های مهمی که باید قبل از ادامه کار درک شوند آورده شده است −

روش make_parser

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


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

در اینجا جزئیات پارامترها آورده شده است −

  • xmlfile − این نام فایل XML است که باید از آن خوانده شود.

  • contenthandler − این باید یک شی ContentHandler باشد.

  • errorhandler − اگر مشخص شده باشد، errorhandler باید یک شی SAX ErrorHandler باشد.

متد parseString

یک متد دیگر برای ایجاد یک پردازشگر SAX و تجزیه رشته XML مشخص شده وجود دارد.


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

در اینجا جزئیات پارامترها آورده شده است −

  • xmlstring − این نام رشته XML است که باید از آن خوانده شود.

  • contenthandler − این باید یک شی ContentHandler باشد.

  • errorhandler − اگر مشخص شده باشد، errorhandler باید یک شی SAX ErrorHandler باشد.

مثال


#!/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()
   # 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

برای جزئیات کامل مستندات API SAX، لطفاً به استاندارد API های SAX Python مراجعه کنید.

تجزیه XML با API های DOM

مدل شیء سند ("DOM") یک API بین زبانی از کنسرسیوم World Wide Web (W3C) برای دسترسی و تغییر اسناد XML است.

DOM برای برنامه های دسترسی تصادفی بسیار مفید است. SAX فقط به شما اجازه می دهد یک قطعه از سند را در یک زمان ببینید. اگر به یک عنصر SAX نگاه می کنید، به دیگری دسترسی ندارید.

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

عبارت نمونه تابع parse( file [,parser] ) شی minidom را برای تجزیه فایل XML تعیین شده توسط file به یک شی درخت 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

برای جزئیات کامل مستندات API DOM، لطفاً به استاندارد API های DOM Python مراجعه کنید.