Extensible Markup Language(XML) є мовою розмітки так само як HTML, або SGML. XML рекомендується W3C(World Wide Web Consortcium) і доступний в якості відкритого стандарту.
XML являє собою мову з відкритим вихідним кодом, що дозволяє програмістам
розробляти програми, які можуть бути прочитані іншими додатками, незалежно,
від ОС чи мови програмування.
XML є надзвичайно корисною для малих та середніх обсягів даних, без
використання SQL.
Стандартна бібліотека Python надає мінімальний, але корисний набір інтерфейсів
для роботи з XML.
Два основних та широко використовуванні API-інтерфейси в XML - це SAX та DOM.
Simple API for XML (SAX)
Ви реєструєте зворотні виклики для потрібних вам подій після чого вони
парсяться до документу. Це корисно, коли ваші документи великі, або є
обмеження у пам'яті. Парсуються файли, які читаються з диска, весь файл не
зберігається у пам'яті.
Document Object Model (DOM) API
Це W3C рекомендація, весь файл зчитується у пам'ять і зберігається в
ієрархічній формі для представлення всіх особливостей XML документа.
SAX не може обробляти інформацію так швидко, як DOM при роботі з великим
файлами. Але з іншого боку, постійне використання DOM може швидко вбити ваші
ресурси, особливо тоді, коли використовується велика кількість маленьких
файлів.
SAX, може тільки зчитувати файли, в той час, як DOM може вносити зміни в XML
файл. Так, як ці два зовсім різні API буквально доповнюють один одного, немає
причин, чому ви не можете використовувати їх разом, особливо для великих
проектів.
Для всіх наших прикладів XML коду, ми будемо використовувати файл**
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>
<movie title="Ishtar">
<type>Comedy</type>
<format>VHS</format>
<rating>PG</rating>
<stars>2</stars>
<description>Viewable boredom</description>
</movie>
</collection>
Парсинг XML використовуючи SAX API
SAX є стандартним інтерфейсом для подієвого розбору XML. Розбір XML за
допомогою SAX зазвичай вимагає, щоб ви створити свій власний**
ContentHandler**(обробник контенту) шляхом створення підкласів
xml.sax.ContentHandler.
Ваш ContentHandler обробляє конкретні теги і атрибути XML. Об'єкт
ContentHandler надає методи для обробки різних парсингових подій. Аналізатор
викликає методи ContentHandler, якими він парсує XML-файл.
Методи StartDocument і EndDocument викликаються на початку і в кінці XML файлу. Метод characters(текст) передає символьні дані XML файлу за допомогою текстового параметра.
ContentHandler викликається на початку і в кінці кожного елемента. Якщо парсер не знаходиться в режимі імен, то викликаються методи StartElement(тег, атрибути) і EndElement(тег); в протилежному випадку, викликаються відповідні методи startElementNS і endElementNS.
Метод make_parser:
Цей метод створює новий парсер-об'єкт та повертає його.
xml.sax.make_parser( [parser_list] )
Детальний опис параметрів:
parser_list \- необов'язковий аргумент, що складається зі списку парсерів, для використання яких, всі повинні реалізувати метод make_parser.
Метод parse:
Цей метод створює SAX парсер і використовує його для розбору документу
xml.sax.parse( xmlfile, contenthandler[, errorhandler]).
Параметри:
xmlstring: це ім'я XML рядка, звідки відбуватиметься зчитування.
contenthandler: об'єкт ContentHandler.
errorhandler: додатковий параметр, об'єкт 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
Для більших можливостей звертайтесь до SAX API документації.
Парсинг XML з DOM API:
DOM - крос-мова API від W3C для доступу і зміни XML документів.
DOM надзвичайна корисна для додатків з довільним доступом. SAX дозволяє
переглядати один біт документа за раз. Тому, якщо ви дивитесь на один SAX
елемент, то ви відповідно не маєте доступу до інших елементів.
Ось найпростіший спосіб швидко завантажити XML документ і створити об'єкт
minidom за допомогою модуля 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
Ще немає коментарів