Читаем Язык программирования Python полностью

   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.

setAttributeNode(newAttr)

Добавляет новый узел–атрибут к элементу. Старый атрибут заменяется, если имеет то же имя.

Здесь стоит заметить, что атрибуты в рамках элемента повторяться не должны. Их порядок также не важен с точки зрения информационной модели XML.

В качестве упражнения предлагается составить функцию, которая будет вычислять значение выражения, заданного в XML–представлении.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных