Роман Сузи - Язык программирования Python
- Название:Язык программирования Python
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Роман Сузи - Язык программирования Python краткое содержание
Курс посвящен одному из бурно развивающихся и популярных в настоящее время сценарных языков программирования — Python. Язык Python позволяет быстро создавать как прототипы программных систем, так и сами программные системы, помогает в интеграции программного обеспечения для решения производственных задач. Python имеет богатую стандартную библиотеку и большое количество модулей расширения практически для всех нужд отрасли информационных технологий. Благодаря ясному синтаксису изучение языка не составляет большой проблемы. Написанные на нем программы получаются структурированными по форме, и в них легко проследить логику работы. На примере языка Python рассматриваются такие важные понятия как: объектно–ориентированное программирование, функциональное программирование, событийно–управляемые программы (GUI–приложения), форматы представления данных (Unicode, XML и т.п.). Возможность диалогового режима работы интерпретатора Python позволяет существенно сократить время изучения самого языка и перейти к решению задач в соответствующих предметных областях. Python свободно доступен для многих платформ, а написанные на нем программы обычно переносимы между платформами без изменений. Это обстоятельство позволяет применять для изучения языка любую имеющуюся аппаратную платформу.
Язык программирования Python - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Концептуально существуют два пути обработки 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–документы таким образом обычно не приходится.
Анализ XML–документа
Для работы с готовым XML–документом нужно воспользоваться XML–анализаторами. Анализ XML–документа с порождением объекта класса Document
происходит всего в одной строчке, с помощью функции parse()
. Здесь стоит заметить, что кроме стандартного пакета xml
можно поставить пакет PyXML
или альтернативные коммерческие пакеты. Тем не менее, разработчики стараются придерживаться единого API, который продиктован стандартом DOM Level 2:
import xml.dom.minidom
dom = xml.dom.minidom.parse("expression.xml")
dom.normalize()
def output_tree(node, level=0):
if node.nodeType == node.TEXT_NODE:
if node.nodeValue.strip():
print ". "*level, node.nodeValue.strip()
else: # ELEMENT_NODE или DOCUMENT_NODE
atts = node.attributes or {}
att_string = ", ".join(
["%s=%s " % (k, v) for k, v in atts.items()])
print ". "*level, node.nodeName, att_string
for child in node.childNodes:
output_tree(child, level+1)
output_tree(dom)
В этом примере дерево выводится с помощью определенной функции output_tree()
, которая принимает на входе узел и вызывается рекурсивно для всех вложенных узлов.
В результате получается примерно следующее:
#document
. expression
. . operation type=+
. . . operand
. . . . 2
. . . operand
. . . . operation type=*
. . . . . operand
. . . . . . 3
. . . . . operand
. . . . . . 4
Здесь же применяется метод normalize()
для того, чтобы все текстовые фрагменты были слиты воедино (в противном случае может следовать подряд несколько узлов с текстом).
Можно заметить, что даже в небольшом примере использовались атрибуты узлов: node.nodeType
указывает тип узла, node.nodeValue
применяется для доступа к данным, node.nodeName
дает имя узла (соответствует названию тега), node.attributes
дает доступ к атрибутам узла. node.childNodes
применяется для доступа к дочерним узлам. Этих свойств достаточно, чтобы рекурсивно обойти дерево.
Все узлы являются экземплярами подклассов класса Node
. Они могут быть следующих типов:
Название | Описание | Метод для создания |
---|---|---|
ELEMENT_NODE |
Элемент | createElement(tagname) |
ATTRIBUTE_NODE |
Атрибут | createAttribute(name) |
TEXT_NODE |
Текстовый узел | createTextNode(data) |
CDATA_SECTION_NODE |
Раздел | CDATA |
ENTITY_REFERENCE_NODE |
Ссылка на сущность | |
ENTITY_NODE |
Сущность | |
PROCESSING_INSTRUCTION_NODE |
Инструкция по обработке | createProcessingInstruction(target, data) |
COMMENT_NODE |
Комментарий | createComment(comment) |
DOCUMENT_NODE |
Документ | |
DOCUMENT_TYPE_NODE |
Тип документа | |
DOCUMENT_FRAGMENT_NODE |
Фрагмент документа | |
NOTATION_NODE |
Нотация |
В DOM документ является деревом, в узлах которого стоят объекты нескольких возможных типов. Узлы могут иметь атрибуты или данные. Доступ к узлам можно осуществлять через атрибуты вроде childNodes
(дочерние узлы), firstChild
(первый дочерний узел), lastChild
(последний дочерний узел), parentNode
(родитель), nextSibling
(следующий брат), previousSibling
(предыдущий брат).
Выше уже говорилось о методе appendChild()
. К нему можно добавить методы insertBefore(newChild, refChild)
(вставить newChild
до refChild
), removeChild(oldChild)
(удалить дочерний узел), replaceChild(newChild, oldChild)
(заметить oldChild
на newChild
). Есть еще метод cloneNode(deep)
, который клонирует узел (вместе с дочерними узлами, если задан deep=1
).
Узел типа ELEMENT_NODE
, помимо перечисленных методов «просто» узла, имеет много других методов. Вот основные из них:
tagName
Имя типа элемента.
getElementsByTagName(tagname)
Получает элементы с указанным именем tagname
среди всех потомков данного элемента.
getAttribute(attname)
Получить значение атрибута с именем attname
.
getAttributeNode(attrname)
Возвращает атрибут с именем attrname
в виде объекта–узла.
removeAttribute(attname)
Удалить атрибут с именем attname
.
removeAttributeNode(oldAttr)
Удалить атрибут oldAttr
(задан в виде объекта–узла).
setAttribute(attname, value)
Устанавливает значение атрибута attname
равным строке value
.
Интервал:
Закладка: