XML بيثون - معالجة Python XML Processing

 بيثون - معالجة  XML

 Python XML Processin

 بيثون - معالجة  XML  Python XML Processing

XML هي لغة محمولة ومفتوحة المصدر تتيح للمبرمجين تطوير تطبيقات يمكن قراءتها بواسطة تطبيقات أخرى ، بغض النظر عن نظام التشغيل و / أو اللغة التطويرية.

What is XML?

لغة التوصيف القابلة للتوسيع (XML) هي لغة توصيفية تشبه إلى حد كبير HTML أو SGML.  يوصى بذلك اتحاد شبكة الويب العالمية ومتاح كمعيار مفتوح.

 XML مفيد للغاية لتتبع كميات صغيرة إلى متوسطة من البيانات دون الحاجة إلى العمود الفقري المستندة إلى SQL.

XML Parser Architectures and APIs

توفر مكتبة Python القياسية مجموعة بسيطة ولكنها مفيدة من الواجهات للعمل مع XML.

 واجهات برمجة التطبيقات (API) الأساسية الأكثر شيوعًا والمستخدمة على نطاق واسع لبيانات XML هما واجهات SAX و DOM.
  • Simple API for XML (SAX) − 
  • هنا ، يمكنك تسجيل عمليات الاسترجاعات للأحداث ذات الاهتمام ثم السماح للمحلل بالمتابعة خلال المستند.  يكون هذا مفيدًا عندما تكون مستنداتك كبيرة أو يكون لديك قيود على الذاكرة ، وتقوم بتوزيع الملف أثناء قراءته من القرص ولا يتم تخزين الملف بالكامل في الذاكرة مطلقًا.
  • Document Object Model (DOM) API 
  • - هذه توصية لمجموعة World Wide Web Consortium حيث يتم قراءة الملف بالكامل في الذاكرة وتخزينه في نموذج هرمي (قائم على شجرة) لتمثيل جميع ميزات مستند XML.

     من الواضح أن SAX لا يمكنها معالجة المعلومات بأسرع ما يمكن عند استخدام ملفات كبيرة.  من ناحية أخرى ، يمكن أن يؤدي استخدام DOM بشكل حصري إلى قتل مواردك ، خاصةً إذا تم استخدامها في الكثير من الملفات الصغيرة.

     SAX للقراءة فقط ، بينما يسمح DOM بإجراء تغييرات على ملف XML.  نظرًا لأن هذين APIs المختلفين يكمل كل منهما الآخر حرفيًا ، فلا يوجد سبب يمنعك من استخدامهما في المشروعات الكبيرة.

     بالنسبة لجميع أمثلة أكواد XML الخاصة بنا ، فلنستخدم ملف XML بسيط للأفلام. xml كمدخل -
 shelf="New Arrivals">
 title="Enemy Behind">
   War, Thriller
DVD 2003 PG 10 Talk about a US-Japan war title="Transformers"> Anime, Science Fiction DVD 1989 R 8 A schientific fiction title="Trigun"> Anime, Action DVD 4 PG 10 Vash the Stampede! title="Ishtar"> Comedy VHS PG 2 Viewable boredom

Parsing XML with SAX APIs

SAX هي واجهة قياسية لتحليل XML المبني على الأحداث.  يتطلب تحليل XML مع SAX عمومًا إنشاء ContentHandler الخاص بك عن طريق التصنيف الفرعي xml.sax.ContentHandler.

 يتعامل ContentHandler مع علامات وسمات نكهة XML الخاصة بك.  يوفر كائن ContentHandler طرقًا لمعالجة أحداث التحليل المختلفة.  المحلل اللغوي الخاص به يستدعي أساليب ContentHandler لأنه يوزع ملف XML.

 يتم استدعاء أساليب startDocument و endDocument في بداية ونهاية ملف XML.  يتم تمرير أحرف الطريقة (النص) بيانات الأحرف لملف XML عبر نص المعلمة.

 يتم استدعاء ContentHandler في بداية ونهاية كل عنصر.  إذا كان المحلل اللغوي غير موجود في وضع مساحة الاسم ، فسيتم استدعاء الأساليب startElement (العلامة والسمات) و endElement (العلامة) ؛  وإلا ، فإن الأساليب المقابلة startElementNS و endElementNS تسمى.  هنا ، العلامة هي علامة العنصر ، والسمات هي كائن سمات.

 فيما يلي طرق مهمة أخرى لفهمها قبل المتابعة -

The make_parser Method

يتبع الأسلوب التالي كائن محلل جديد وإعادته.  سيكون كائن المحلل اللغوي الذي تم إنشاؤه من النوع الأول الذي يعثر عليه النظام.
xml.sax.make_parser( [parser_list] )
هنا تفاصيل المعلمات -
  • parser_list − 
  • الوسيطة الاختيارية التي تتكون من قائمة من المحللون المراد استخدامها والتي يجب أن تطبق جميعها على أسلوب make_parser.

The parse Method

يتبع الأسلوب التالي محلل SAX ويستخدمه لتحليل مستند.
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
هنا تفاصيل المعلمات -
  • xmlfile − 
  • هذا هو اسم ملف XML للقراءة منه.
  • contenthandler −
  • يجب أن يكون هذا كائن ContentHandler. 
  • errorhandler −
  • في حالة التحديد ، يجب أن يكون errorhandler كائن SAX ErrorHandler. 

The parseString Method

هناك طريقة أخرى لإنشاء محلل SAX وتحليل سلسلة XML المحددة.
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
هنا تفاصيل المعلمات -
  • xmlstring −
  •  هذا هو اسم سلسلة XML للقراءة منه.
  • contenthandler − 
  • يجب أن يكون هذا كائن ContentHandler.
  • errorhandler −
  • في حالة التحديد ، يجب أن يكون errorhandler كائن SAX ErrorHandler.

مثال Example

#!/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
للحصول على تفاصيل كاملة حول وثائق SAX API ، يرجى الرجوع إلى واجهات برمجة التطبيقات Python SAX القياسية.

Parsing XML with DOM APIs

تحليل XML مع DOM واجهات برمجة التطبيقات
نموذج كائن المستند ("DOM") هو واجهة برمجة تطبيقات مشتركة للغة من اتحاد شبكة الويب العالمية (W3C) للوصول إلى مستندات XML وتعديلها.

 DOM مفيد للغاية لتطبيقات الوصول العشوائي.  يتيح لك SAX عرض جزء واحد فقط من المستند في وقت واحد.  إذا كنت تبحث عن أحد عناصر SAX ، فلن تتمكن من الوصول إلى عنصر آخر.

 إليك أسهل طريقة لتحميل مستند XML بسرعة وإنشاء كائن مصغر باستخدام الوحدة النمطية xml.dom.  يوفر كائن minidom طريقة محلل بسيطة تنشئ بسرعة شجرة DOM من ملف XML.

 تستدعي العبارة النموذجية وظيفة التحليل (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

للحصول على تفاصيل كاملة حول وثائق DOM API ، يرجى الرجوع إلى Python DOM APIs القياسية.