Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

[ Россум, Дрейк, Откидач ] Язык программирования Python

.pdf
Скачиваний:
293
Добавлен:
25.04.2014
Размер:
1.5 Mб
Скачать

29.8. xml.sax.xmlreader — интерфейс объектов, . . .

401

него класса). По умолчанию (до вызова этого метода) используется объект, открывающий документ, на который указывает системный идентификатор (отсутствие в определении сущности системного идентификатора приведет к ошибке).

getErrorHandler()

Возвращает текущий обработчик ошибок (экземпляр xml.sax.handler.ErrorHandler или производного от него класса).

setErrorHandler(handler)

Устанавливает handler в качестве текущего обработчика ошибок. По умолчанию (до вызова этого метода) используется объект, генерирующий исключение в случае ошибок и выводящий предупреждения на стандартный поток вывода (sys.stdout).

setLocale(locale)

Устанавливает язык и кодировку сообщений об ошибках и предупреждений.

getFeature(featurename)

Возвращает текущие установки для особенности с именем featurename. Если особенность неизвестна, генерирует исключение SAXNotRecognizedException. Символические константы для наиболее известных имен особенностей определены в модуле xml.sax.handler.

setFeature(featurename, value)

Изменяет установки для особенности с именем featurename. Для неизвестных особенностей генерирует исключение SAXNotRecognizedException, если синтаксический анализатор не поддерживает указанную особенность — генерирует исключение SAXNotSupportedException.

getProperty(propertyname)

Возвращает текущие установки для свойства propertyname. Если свойство неизвестно, генерирует исключение SAXNotRecognizedException. Символические константы для наиболее известных имен свойств определены в модуле xml.sax.handler.

setProperty(propertyname, value)

Изменяет установки для свойства propertyname. Для неизвестных свойств генерирует исключение SAXNotRecognizedException, если синтаксический анализатор не поддерживает указанное свойство — генерирует исключение

SAXNotSupportedException.

29.8.2Интерфейс класса IncrementalParser

Класс IncrementalParser является производным от XMLReader, его интерфейс имеет несколько дополнительных методов:

feed(data)

Анализирует порцию данных data.

402

Глава 29. Средства работы с языками структурной разметки

close()

Вызов этого метода указывает на конец документа.

reset()

Этот метод должен быть вызван после метода close() для подготовки к анализу следующего документа.

29.8.3Интерфейс класса Locator

Интерфейс класса Locator составляют следующие методы:

getColumnNumber()

Возвращает номер позиции в строке, в которой заканчиваются данные, соответствующие текущему событию (-1, если позиция неизвестна).

getLineNumber()

Возвращает номер строки, в которой заканчиваются данные, соответствующие текущему событию (-1, если номер строки неизвестен).

getPublicId()

Возвращает публичный идентификатор для текущего события (None, если публичный идентификатор не может быть установлен).

getSystemId()

Возвращает системный идентификатор для текущего события (None, если системный идентификатор не может быть установлен).

29.8.4 Экземпляры класса InputSource

Экземпляры класса InputSource имеют следующие методы:

setPublicId(id)

Устанавливает публичный идентификатор документа равным строке id.

getPublicId()

Возвращает публичный идентификатор документа.

setSystemId(id)

Устанавливает системный идентификатор документа равным строке id.

getSystemId()

Возвращает системный идентификатор документа.

setEncoding(encoding)

Устанавливает кодировку документа. Аргумент encoding должен быть строкой,

29.8. xml.sax.xmlreader — интерфейс объектов, . . .

403

применимой для использования в объявлении кодировки XML-документа. Установленная кодировка будет проигнорирована синтаксическим анализатором документа, если установлен символьный поток, осуществляющий автоматическое преобразование.

getEncoding()

Возвращает кодировку документа или None, если кодировка неизвестна.

setByteStream(bytefile)

Устанавливает байтовый поток (файловый или подобный объект, не выполняющий преобразование байтов в символы), из которого будет производиться чтение документа. Кодировка потока может быть установлена с помощью метода setEncoding. Байтовый поток не будет использоваться синтаксическим анализатором документа, если установлен символьный поток, осуществляющий автоматическое преобразование байтов (в определенной кодировке) в символы Unicode.

getByteStream()

Возвращает байтовый поток, из которого должно производиться чтение документа. Кодировка этого потока может быть получена с помощью метода getEncoding.

setCharacterStream(charfile)

Устанавливает символьный поток (файловый или подобный объект, осуществляющий автоматическое преобразование байтов в определенной кодировке в символы Unicode), из которого должно производиться чтение документа.

getCharacterStream()

Возвращает символьный поток, из которого должно производиться чтение документа.

29.8.5Экземпляры классов AttributesImpl и AttributesNSImpl

Экземпляры классов AttributesImpl и AttributesNSImpl являются отображениями, в качестве ключей в которых выступают именами атрибутов, и в качестве значений — их значения. Для экземпляров класса AttributesImpl имена атрибутов (а также аргумент name описанных ниже методов) являются строками, для экземпляров AttributesNSImpl — кортежами из двух строк: с URI пространства имен и локального имени атрибута. Полное имя атрибута (аргумент qname методов) в обоих случаях является строкой. Помимо общих для всех отображений операций и основных методов (copy(), get(), has_key(), items(), keys() и values()) они имеют следующие методы:

getLength()

Возвращает число атрибутов.

getNames()

Возвращает список имен атрибутов (ключей отображения).

404

Глава 29. Средства работы с языками структурной разметки

getType(name)

Возвращает тип атрибута с именем name (обычно ’CDATA’).

getValue(name)

Возвращает значение атрибута с именем name.

getValueByQName(qname)

Возвращает значения атрибута по его полному имени qname. Для экземпляров класса AttributesImpl этот метод эквивалентен методу getValue().

getNameByQName(qname)

Возвращает имя атрибута (строку или кортеж) по его полному имени qname. Для экземпляров класса AttributesImpl этот метод возвращает свой аргумент без изменений или генерирует исключение KeyError.

getQNameByName(name)

Возвращает полное имя атрибута с именем name. Для экземпляров класса AttributesImpl этот метод возвращает свой аргумент без изменений или генерирует исключение KeyError.

getQNames()

Возвращает список полных имен атрибутов. Для экземпляров класса AttributesImpl этот метод эквивалентен методу getNames().

29.9xmllib — обработка XML-документов

Модуль xmllib считается устаревшим — используйте вместо него модуль xml.sax. Этот модуль определяет класс XMLParser, который может служить в качестве базового для класса, реализующего обработку размеченного текста в формате XML3 (Extensible Markup Language, расширяемый язык разметки).

XMLParser([**keyword_args])

Создает и возвращает объект, реализующий обработку текста в формате XML. В настоящий момент воспринимаются следующие именованные аргументы (keyword_args):

accept_unquoted_attributes

Если этот аргумент является истиной, обработчик будет воспринимать значения атрибутов, не заключенных в кавычки. По умолчанию равен 0.

accept_missing_endtag_name

Если этот аргумент является истиной, обработчик будет воспринимать закрывающие безымянные теги (‘</>’). По умолчанию равен 0.

3http://www.w3.org/TR/REC-xml, http://www.w3.org/XML/

29.9. xmllib — обработка XML-документов

405

map_case

Если этот аргумент является истиной, обработчик будет приводить имена тегов и атрибутов к нижнему регистру. По умолчанию равен 0.

accept_utf8

Если этот аргумент является истиной, обработчик допускает использование входной кодировки UTF-8. По умолчанию равен 0.

translate_attribute_references

Если этот аргумент является истиной, обработчик будет заменять ссылки на символы и сущности в значениях атрибутов. По умолчанию равен 1.

Класс XMLParser имеет следующие интерфейсные атрибуты данных и методы, которые определяют тип документа (DTD):

attributes

Отображение, в котором в качестве ключей выступают имена элементов и в качестве значений — отображения имен возможных для данного элемента атрибутов к их значениям по умолчанию (или None, если атрибут не имеет значения по умолчанию). Вам следует переопределить этот атрибут в производном классе — в исходной реализации он равен пустому словарю.

elements

Отображение имен элементов к кортежам из функций (или других объектов, поддерживающих вызов), предназначенных для обработки открывающего и закрывающего тега для этого элемента или None, если должен быть вызван метод unknown_starttag() или unknown_endtag(). Вам следует переопределить этот атрибут в производном классе — в исходной реализации он равен пустому словарю.

entitydefs

Отображение имен сущностей к их значениям. В исходной реализации равен словарю, в котором есть записи с ключами ’lt’, ’gt’, ’amp’, ’quot’ и ’apos’ (обязательный набор для всех типов документов).

reset()

Возвращает экземпляр в исходное состояние. Все необработанные данные теряются. Этот метод неявно вызывается при инициализации.

setnomoretags()

Останавливает обработку тегов. Весь последующий текст воспринимается без обработки (CDATA).

setliteral()

Временно приостанавливает обработку тегов. Последующий текст воспринимается без обработки (CDATA). Обработчик автоматически выходит из этого режима, как только дойдет до закрывающего тега для последнего открытого.

feed(data)

Передает экземпляру размеченный текст data для обработки. Обрабатываются

406

Глава 29. Средства работы с языками структурной разметки

только завершенные данные, остальное остается в буфере до тех пор, пока не будет передана следующая порция данных или не будет вызван метод close().

close()

Завершает обработку всех данных в буфере. Вы можете переопределить этот метод в производном классе, добавив дополнительные действия. Переопределенный метод всегда должен вызывать исходную версию метода.

translate_references(data)

Преобразует все ссылки на символы (‘ref;’) и сущности (‘&ref;’) в строке data и возвращает полученный текст.

getnamespace()

Возвращает отображение аббревиатур для (активных в настоящий момент) пространств имен к их URI (Uniform Resource Identifier, универсальный идентификатор ресурса).

handle_xml(encoding, standalone)

Вызывается для обработки тега ‘<?xml ...?>’. В качестве аргументов используются значения одноименных атрибутов тега (по умолчанию используются None и строка ’no’ соответственно). Исходная реализация ничего не делает.

handle_doctype(tag, pubid, syslit, data)

Вызывается для обработки объявления типа документа. Аргумент tag является строкой с именем корневого элемента, pubid — формальный публичный идентификатор (или None, если не задан), syslit — системный идентификатор и data — необработанный текст встроенного в документ DTD (Document Type Definition, определение типа документа) или None, если документ не содержит DTD. Исходная реализация ничего не делает.

handle_starttag(tag, method, attributes)

 

Вызывается для обработки открывающих тегов, для которых

задан обработ-

чик в атрибуте elements. Аргумент tag является строкой

с именем те-

га, method — функция (метод), предназначенная для обработки открывающего тега, и attributes — словарь, отображающий имена атрибутов, найденных внутри угловых скобок тега, к их значениям (после обработки ссылок на символы и сущности). Например, для обработки открывающего тега ‘<A HREF="http://www.cwi.nl/»’ вызывается ‘obj.handle_starttag(’A’,

obj.elements[’A’][0], {’HREF’: ’http://www.cwi.nl/’})’. Исходная реализация метода handle_starttag вызывает method(attributes).

handle_endtag(tag, method)

 

 

Вызывается для обработки закрывающих тегов, для

которых задан обработ-

чик в атрибуте elements. Аргумент

tag является

строкой с именем те-

га, method — функция (метод), предназначенная для обработки закрываю-

щего тега. Например, для обработки

закрывающего

тега ‘</A>’ вызывается

obj.handle_endtag(’A’, obj.elements[’A’][1])’. Исходная реализация метода handle_endtag просто вызывает method().

29.9. xmllib — обработка XML-документов

407

handle_data(data)

Вызывается для обработки простого текста. Вам следует переопределить его в производном классе: исходная реализация ничего не делает.

handle_charref(ref)

Вызывается для обработки ссылок на символы в виде ‘ref;’. Исходная реализация преобразует число в диапазоне от 0 до 255 в символ с помощью встроенной функции chr() и вызывает с ним метод handle_data(). Если аргумент ref неверен или выходит за пределы указанного диапазона, вызывает unknown_charref(ref) для обработки ошибки.

handle_comment(comment)

Вызывается для обработки комментария. В качестве аргумента comment используется строка с текстом, содержащимся между ‘<!--’ и ‘-->’. Исходная реализация ничего не делает.

handle_cdata(data)

Вызывается для обработки элементов CDATA (текста между ‘<![CDATA[’ и ‘]]>’). Вам следует переопределить его в производном классе: исходная реализация ничего не делает.

handle_proc(name, data)

Вызывается для инструкций обработки (PI, Processing Instruction) в виде ‘<?name data?>’. Обратите внимание, что ‘<?xml data?>’ обрабатывается отдельно — с помощью метода handle_xml(). Вам следует переопределить метод handle_proc() в производном классе: исходная реализация ничего не делает.

handle_special(data)

Вызывается для обработки объявлений в виде ‘<!data>’. Обратите внимание, что ‘<!DOCTYPE ...>’ в начале документа обрабатывается отдельно — с помощью метода handle_doctype(). Вам следует переопределить метод handle_special() в производном классе: исходная реализация ничего не делает.

syntax_error(message)

Этот метод вызывается, если в документе обнаружена синтаксическая ошибка, при которой возможна дальнейшая обработка (при обнаружении фатальных ошибок этот метод не вызывается — сразу генерируется исключение RuntimeError). В качестве аргумента message используется строка с сообщением о том, что произошло. Исходная реализация этого метода генерирует исключение RuntimeError.

unknown_starttag(tag)

Вызывается для обработки неизвестного открывающего тега. Вам следует переопределить этот метод в производном классе: исходная реализация ничего не делает.

unknown_endtag(tag)

Вызывается для обработки неизвестного закрывающего тега. Вам следует переопределить этот метод в производном классе: исходная реализация ничего не делает.

408

Глава 29. Средства работы с языками структурной разметки

unknown_charref(ref)

Вызывается для обработки неверной ссылки на символ в виде ‘ref;’. Вам следует переопределить этот метод в производном классе: исходная реализация ничего не делает.

unknown_entityref(ref)

Вызывается для обработки ссылки на сущность с неизвестным именем в виде ‘&ref;’. Вам следует переопределить этот метод в производном классе: исходная реализация вызывает метод syntax_error() для обработки ошибки.

Модуль xmllib поддерживает пространства имен XML. Полные имена тегов и атрибутов (то, что используется в качестве аргументов методов), опре-

деленных

в

пространстве имен, состоит URI, определяющего пространство имен,

и

самого

 

имени тега

или атрибута,

разделенных пробелом.

Например, за-

пись ‘<html xmlns=’http://www.w3.org/TR/REC-html40’>

воспринимается

как

тег

с

именем ’http://www.w3.org/TR/REC-html40 html’

и запись

<html:a

 

href=’http://frob.com’>

внутри этого элемента

воспринимает-

ся

как тег

с именем

’http://www.w3.org/TR/REC-html40

a’

и

атрибутом

’http://www.w3.org/TR/REC-html40 href’.

409

Глава 30

Разное

fileinput

Перебор строк из нескольких входных потоков.

ConfigParser

Чтение конфигурационных файлов.

shlex

простой синтаксический анализатор для командных языков.

cmd

Создание построчных командных интерпретаторов.

calendar

Функции для работы с календарем, включая эмуляцию программы

 

cal.

30.1fileinput — перебор строк из нескольких входных потоков

Модуль fileinput определяет класс и функции, помогающие перебирать строки, полученные со стандартного потока и/или файлов, указанных списков. Чаще всего этот модуль используется примерно следующим образом:

import fileinput

for line in fileinput.input(): process(line)

В этом случае перебираются строки файлов, имена которых указаны в качестве аргументов в командной строке (sys.argv[1:]), или стандартного потока ввода, если этот список пуст. Имя файла ’-’ считается ссылающимся на стандартный поток ввода sys.stdin. Вы можете указать альтернативный список имен файлов (или имя одного файла) в качестве первого аргумента функции input().

Все файлы открываются в текстовом режиме, поэтому модуль может быть использован только для чтения файлов с текстом в однобайтовой кодировке.

input([files [, inplace [, backup]]])

Создает и возвращает экземпляр класса FileInput, который также сохраняется и используется другими функций этого модуля. Все аргументы передаются конструктору.

410

Глава 30. Разное

Следующие функции используют экземпляр класса FileInput, созданный и сохраненный функцией input(). При попытке использования этих функций без предварительного вызова input() или после вызова функции close() генерируется исключение RuntimeError. Текущим всегда считается файл, из которого была прочитана последняя строка.

filename()

Возвращает имя файла, для которого была прочитана последняя строка. До того, как прочитана первая строка (в том числе непосредственно после вызова функции nextfile()), возвращает None. Для стандартного потока ввода возвращает

’<stdin>’.

lineno()

Возвращает суммарный номер последней прочитанной строки. До того, как прочитана первая строка (в том числе непосредственно после вызова функции nextfile()), возвращает 0.

filelineno()

Возвращает номер последней прочитанной строки в текущем файле. До того, как прочитана первая строка (в том числе непосредственно после вызова функции nextfile()), возвращает 0.

isfirstline()

Возвращает 1, если последняя прочитанная строка является первой в текущем файле, иначе возвращает 0.

isstdin()

Возвращает 1, если последняя строка была прочитана со стандартного потока ввода (sys.stdin), иначе возвращает 0.

nextfile()

Закрывает текущий файл и переходит к следующему. Строки, не прочитанные из этого файла, не будут учитываться при вычислении суммарного номера строки. До прочтения первой строки эта функция не дает никакого эффекта.

close()

Вызывает метод close() экземпляра, сохраненного функцией input().

Следующий класс реализует чтение из нескольких файлов и может быть использован для определения производных классов:

FileInput([files [, inplace [, backup]]])

Создает и возвращает объект, обеспечивающий чтение строк из нескольких файлов. Аргумент files должен быть списком имен файлов или строкой с именем файла. По умолчанию используется sys.argv[1:] или стандартный поток ввода, если список аргументов командной строки пуст. Имя ’-’ является специальным, для него используется поток sys.stdin.