Чтение онлайн

на главную - закладки

Жанры

Язык программирования Python
Шрифт:

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)

Поделиться:
Популярные книги

На границе империй. Том 10. Часть 6

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 6

Антимаг его величества. Том III

Петров Максим Николаевич
3. Модификант
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Антимаг его величества. Том III

Герой

Бубела Олег Николаевич
4. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Герой

Печать Пожирателя

Соломенный Илья
1. Пожиратель
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Печать Пожирателя

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Шайтан Иван 3

Тен Эдуард
3. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
7.17
рейтинг книги
Шайтан Иван 3

Изгой Проклятого Клана. Том 2

Пламенев Владимир
2. Изгой
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Изгой Проклятого Клана. Том 2

Твое сердце будет разбито. Книга 1

Джейн Анна
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Твое сердце будет разбито. Книга 1

Играть... в тебя

Зайцева Мария
3. Звериные повадки Симоновых
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Играть... в тебя

Князь

Шмаков Алексей Семенович
5. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
5.00
рейтинг книги
Князь

Приказано выжить!

Малыгин Владимир
1. Другая Русь
Фантастика:
боевая фантастика
попаданцы
альтернативная история
7.09
рейтинг книги
Приказано выжить!

Личный аптекарь императора

Карелин Сергей Витальевич
1. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Личный аптекарь императора

Серпентарий

Мадир Ирена
Young Adult. Темный мир Шарана. Вселенная Ирены Мадир
Фантастика:
фэнтези
готический роман
5.00
рейтинг книги
Серпентарий

Цеховик. Книга 1. Отрицание

Ромов Дмитрий
1. Цеховик
Фантастика:
попаданцы
альтернативная история
5.75
рейтинг книги
Цеховик. Книга 1. Отрицание