Python - XML ​​İşleme

XML, programcıların işletim sistemi ve / veya geliştirme dilinden bağımsız olarak diğer uygulamalar tarafından okunabilen uygulamalar geliştirmesine olanak tanıyan taşınabilir, açık kaynaklı bir dildir.

XML nedir?

Genişletilebilir Biçimlendirme Dili (XML), HTML veya SGML'ye çok benzer bir biçimlendirme dilidir. Bu, World Wide Web Konsorsiyumu tarafından önerilir ve açık bir standart olarak mevcuttur.

XML, SQL tabanlı bir omurga gerektirmeden küçük ila orta büyüklükteki verileri izlemek için son derece kullanışlıdır.

XML Ayrıştırıcı Mimarileri ve API'leri

Python standart kitaplığı, XML ile çalışmak için minimal ama kullanışlı bir arabirim kümesi sağlar.

XML verileri için en temel ve yaygın olarak kullanılan iki API, SAX ve DOM arayüzleridir.

  • Simple API for XML (SAX)- Burada, ilgili olaylar için geri aramaları kaydedersiniz ve ardından ayrıştırıcının belge boyunca ilerlemesine izin verirsiniz. Bu, belgeleriniz büyük olduğunda veya bellek sınırlamalarınız olduğunda kullanışlıdır, dosyayı diskten okurken ayrıştırır ve dosyanın tamamı hiçbir zaman bellekte depolanmaz.

  • Document Object Model (DOM) API - Bu, tüm dosyanın belleğe okunduğu ve bir XML belgesinin tüm özelliklerini temsil etmek için hiyerarşik (ağaç tabanlı) bir biçimde saklandığı bir World Wide Web Konsorsiyumu önerisidir.

SAX, büyük dosyalarla çalışırken DOM'un yapabildiği kadar hızlı bilgiyi işleyemez. Öte yandan, yalnızca DOM'u kullanmak, özellikle çok sayıda küçük dosyada kullanılıyorsa, kaynaklarınızı gerçekten öldürebilir.

SAX salt okunurdur, DOM ise XML dosyasında değişikliklere izin verir. Bu iki farklı API tam anlamıyla birbirini tamamladığından, büyük projelerde ikisini birden kullanamamanız için hiçbir neden yoktur.

Tüm XML kodu örneklerimiz için, girdi olarak basit bir XML dosyası movies.xml kullanalım -

<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'i SAX API'leri ile ayrıştırma

SAX, olaya dayalı XML ayrıştırma için standart bir arabirimdir. XML'i SAX ile ayrıştırmak genellikle xml.sax.ContentHandler'ı alt sınıflayarak kendi ContentHandler'ınızı oluşturmanızı gerektirir.

Kişisel ContentHandler belirli etiketler kolları ve XML sizin lezzet (ler) bağlıyor. ContentHandler nesnesi, çeşitli ayrıştırma olaylarını işlemek için yöntemler sağlar. Sahip ayrıştırıcısı, XML dosyasını ayrıştırırken ContentHandler yöntemlerini çağırır.

StartDocument ve endDocument yöntemleri XML dosyasının başlangıcında ve sonunda çağrılır. Yöntem karakterleri (metin) , parametre metni aracılığıyla XML dosyasının karakter verileridir.

ContentHandler, her öğenin başında ve sonunda çağrılır. Ayrıştırıcı ad alanı modunda değilse, startElement (etiket, öznitelikler) ve endElement (etiket) yöntemleri çağrılır; aksi takdirde, ilgili yöntemler startElementNS ve endElementNS çağrılır. Burada etiket, öğe etiketidir ve nitelikler bir Nitelikler nesnesidir.

Devam etmeden önce anlamanız gereken diğer önemli yöntemler:

make_parser Yöntemi

Aşağıdaki yöntem yeni bir ayrıştırıcı nesnesi oluşturur ve onu döndürür. Oluşturulan ayrıştırıcı nesnesi, sistemin bulduğu ilk ayrıştırıcı türünde olacaktır.

xml.sax.make_parser( [parser_list] )

İşte parametrelerin detayı -

  • parser_list - Tümünün make_parser yöntemini uygulaması gereken, kullanılacak ayrıştırıcıların bir listesinden oluşan isteğe bağlı bağımsız değişken.

ayrıştırma Yöntemi

Aşağıdaki yöntem bir SAX ayrıştırıcısı oluşturur ve bir belgeyi ayrıştırmak için kullanır.

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

İşte parametrelerin detayı -

  • xmlfile - Bu, okunacak XML dosyasının adıdır.

  • contenthandler - Bu bir ContentHandler nesnesi olmalıdır.

  • errorhandler - Belirtilirse, errorhandler bir SAX ErrorHandler nesnesi olmalıdır.

parseString Yöntemi

SAX ayrıştırıcısı oluşturmak ve belirtilenleri ayrıştırmak için bir yöntem daha vardır. XML string.

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

İşte parametrelerin detayı -

  • xmlstring - Bu, okunacak XML dizesinin adıdır.

  • contenthandler - Bu bir ContentHandler nesnesi olmalıdır.

  • errorhandler - Belirtilirse, errorhandler bir SAX ErrorHandler nesnesi olmalıdır.

Misal

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

Bu, aşağıdaki sonucu verecektir -

*****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 belgeleri hakkında eksiksiz bir ayrıntı için, lütfen standart Python SAX API'lerine bakın .

XML'i DOM API'leriyle ayrıştırma

Belge Nesne Modeli ("DOM"), XML belgelerine erişmek ve bunları değiştirmek için World Wide Web Consortium (W3C) tarafından sağlanan bir diller arası API'dir.

DOM, rastgele erişimli uygulamalar için son derece kullanışlıdır. SAX, bir seferde belgenin yalnızca bir bitinin görüntülenmesine izin verir. Bir SAX öğesine bakıyorsanız, diğerine erişiminiz yoktur.

İşte bir XML belgesini hızlı bir şekilde yüklemenin ve xml.dom modülünü kullanarak bir minidom nesnesi oluşturmanın en kolay yolu. Minidom nesnesi, XML dosyasından hızla bir DOM ağacı oluşturan basit bir ayrıştırıcı yöntemi sağlar.

Örnek ifade, dosya tarafından belirlenen XML dosyasını bir DOM ağaç nesnesine ayrıştırmak için minidom nesnesinin ayrıştırma (dosya [, ayrıştırıcı]) işlevini çağırır.

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

Bu, aşağıdaki sonucu verecektir -

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 belgelerine ilişkin eksiksiz bir ayrıntı için, lütfen standart Python DOM API'lerine bakın .