Язык программирования Python

       

Формирование XML-документа


Концептуально существуют два пути обработки XML-документа: последовательная обработка и работа с объектной моделью документа.

В первом случае обычно используется SAX (Simple API for XML, простой программный интерфейс для XML). Работа SAX заключается в чтении источников данных (input source) XML-анализаторами (XML-reader) и генерации последовательности событий (events), которые обрабатываются объектами-обработчиками (handlers). SAX дает последовательный доступ к XML-документу.

Во втором случае анализатор XML строит DOM (Document Object Model, объектная модель документа), предлагая для XML-документа конкретную объектную модель. В рамках этой модели узлы DOM-дерева доступны для произвольного доступа,а для переходов между узлами предусмотрен ряд методов.

Можно применить оба этих подхода для формирования приведенного выше XML-документа.

С помощью SAX документ сформируется так:

import sys from xml.sax.saxutils import XMLGenerator g = XMLGenerator(sys.stdout) g.startDocument() g.startElement("expression", {}) g.startElement("operation", {"type": "+"}) g.startElement("operand", {}) g.characters("2") g.endElement("operand") g.startElement("operand", {}) g.startElement("operation", {"type": "*"}) g.startElement("operand", {}) g.characters("3") g.endElement("operand") g.startElement("operand", {}) g.characters("4") g.endElement("operand") g.endElement("operation") g.endElement("operand") g.endElement("operation") g.endElement("expression") g.endDocument()

Построение дерева объектной модели документа может выглядеть, например, так:

from xml.dom import minidom dom = minidom.Document() e1 = dom.createElement("expression") dom.appendChild(e1) p1 = dom.createElement("operation") p1.setAttribute('type', '+') x1 = dom.createElement("operand") x1.appendChild(dom.createTextNode("2")) p1.appendChild(x1) e1.appendChild(p1) p2 = dom.createElement("operation") p2.setAttribute('type', '*') x2 = dom.createElement("operand") x2.appendChild(dom.createTextNode("3")) p2.appendChild(x2) x3 = dom.createElement("operand") x3.appendChild(dom.createTextNode("4")) p2.appendChild(x3) x4 = dom.createElement("operand") x4.appendChild(p2) p1.appendChild(x4) print dom.toprettyxml()

Легко заметить, что при использовании SAX команды на генерацию тегов и других частей выдаются последовательно, а вот построение одной и той же DOM можно выполнять различными последовательностями команд формирования узла и его соединения с другими узлами.

Конечно, указанные примеры носят довольно теоретический характер, так как на практике строить XML-документы таким образом обычно не приходится.



Содержание раздела