XML в Python

10 хв. читання

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
Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 6.2K
Приєднався: 7 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація