Документация Python неофициальный перевод

xml.dom.minidom.md

219 строк · 18.8 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.2/library/xml.dom.minidom.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 19.8. [`xml.dom.minidom`](https://python-all.ru/3.2/library/xml.dom.minidom.html#module-xml.dom.minidom) – минимальная реализация DOM89**Исходный код:** [Lib/xml/dom/minidom.py](https://python-all.ru/src/3.2/Lib/xml/dom/minidom.py)1011---1213[`xml.dom.minidom`](https://python-all.ru/3.2/library/xml.dom.minidom.html#module-xml.dom.minidom) – это минимальная реализация интерфейса Document Object Model с API, похожим на API в других языках. Он задуман как более простой, чем полный DOM, и значительно меньше. Пользователям, которые ещё не знакомы с DOM, следует рассмотреть использование модуля [`xml.etree.ElementTree`](https://python-all.ru/3.2/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) для обработки XML вместо этого.1415> **Предупреждение**16>17> Модуль [`xml.dom.minidom`](https://python-all.ru/3.2/library/xml.dom.minidom.html#module-xml.dom.minidom) не является безопасным для злонамеренно сконструированных данных. Если требуется обрабатывать ненадёжные или неаутентифицированные данные, см. [*XML vulnerabilities*](https://python-all.ru/3.2/library/xml.html#xml-vulnerabilities).1819Приложения DOM обычно начинают с разбора некоторого XML в DOM. С помощью [`xml.dom.minidom`](https://python-all.ru/3.2/library/xml.dom.minidom.html#module-xml.dom.minidom) это делается через функции parse:2021```python22from xml.dom.minidom import parse, parseString2324dom1 = parse('c:\\temp\\mydata.xml') # разобрать XML-файл по имени2526datasource = open('c:\\temp\\mydata.xml')27dom2 = parse(datasource)   # разобрать открытый файл2829dom3 = parseString('<myxml>Some data<empty/> some more data</myxml>')30```3132Функция [`parse()`](https://python-all.ru/3.2/library/xml.dom.minidom.html#xml.dom.minidom.parse) может принимать либо имя файла, либо открытый файловый объект.3334#### `xml.dom.minidom.parse(filename_or_file, parser=None, bufsize=None)`3536Возвращает `Document` из переданных данных. *filename\_or\_file* может быть как именем файла, так и объектом, похожим на файл. *parser*, если задан, должен быть объектом парсера SAX2. Эта функция изменит обработчик документа парсера и активирует поддержку пространств имён; другие настройки парсера (например, установка резолвера сущностей) должны быть выполнены заранее.3738Если XML находится в строке, можно использовать функцию [`parseString()`](https://python-all.ru/3.2/library/xml.dom.minidom.html#xml.dom.minidom.parseString) вместо этого:3940#### `xml.dom.minidom.parseString(string, parser=None)`4142Возвращает объект `Document`, представляющий *строку*. Этот метод создаёт объект `StringIO` для строки и передаёт его в [`parse()`](https://python-all.ru/3.2/library/xml.dom.minidom.html#xml.dom.minidom.parse).4344Обе функции возвращают объект `Document`, представляющий содержимое документа.4546Функции [`parse()`](https://python-all.ru/3.2/library/xml.dom.minidom.html#xml.dom.minidom.parse) и [`parseString()`](https://python-all.ru/3.2/library/xml.dom.minidom.html#xml.dom.minidom.parseString) подключают XML-парсер к «построителю DOM», который может принимать события парсинга от любого SAX-парсера и преобразовывать их в DOM-дерево. Названия функций, возможно, вводят в заблуждение, но их легко понять при изучении интерфейсов. Разбор документа завершается до возврата из этих функций; просто сами функции не предоставляют реализацию парсера.4748Можно также создать `Document`, вызвав метод объекта «DOM Implementation». Этот объект можно получить, вызвав функцию `getDOMImplementation()` в пакете [`xml.dom`](https://python-all.ru/3.2/library/xml.dom.html#module-xml.dom) или в модуле [`xml.dom.minidom`](https://python-all.ru/3.2/library/xml.dom.minidom.html#module-xml.dom.minidom). Получив `Document`, можно добавлять к нему дочерние узлы для заполнения DOM:4950```python51from xml.dom.minidom import getDOMImplementation5253impl = getDOMImplementation()5455newdoc = impl.createDocument(None, "some_tag", None)56top_element = newdoc.documentElement57text = newdoc.createTextNode('Some textual content.')58top_element.appendChild(text)59```6061Получив объект DOM-документа, можно обращаться к частям XML-документа через его свойства и методы. Эти свойства определены в спецификации DOM. Основным свойством объекта документа является свойство `documentElement`. Оно даёт основной элемент XML-документа: тот, который содержит все остальные. Вот пример программы:6263```python64dom3 = parseString("<myxml>Some data</myxml>")65assert dom3.documentElement.tagName == "myxml"66```6768Когда работа с DOM-деревом завершена, можно по желанию вызвать метод `unlink()`, чтобы ускорить очистку уже не нужных объектов. `unlink()` является расширением DOM API, специфичным для [`xml.dom.minidom`](https://python-all.ru/3.2/library/xml.dom.minidom.html#module-xml.dom.minidom), которое делает узел и его потомков по сути бесполезными. В противном случае сборщик мусора Python в конечном итоге позаботится об объектах в дереве.6970> **См. также**71>72> **[Спецификация объектной модели документа (DOM) уровня 1](https://python-all.ru/3.2/library/xml.dom.minidom.html)**73>74> Рекомендация W3C для DOM, поддерживаемая75>76> [`xml.dom.minidom`](https://python-all.ru/3.2/library/xml.dom.minidom.html#module-xml.dom.minidom)77>78> .7980## 19.8.1. Объекты DOM8182Определение DOM API для Python приведено в документации модуля [`xml.dom`](https://python-all.ru/3.2/library/xml.dom.html#module-xml.dom). В этом разделе перечислены различия между этим API и [`xml.dom.minidom`](https://python-all.ru/3.2/library/xml.dom.minidom.html#module-xml.dom.minidom).8384#### `Node.unlink()`8586Разрывает внутренние ссылки в DOM, чтобы дерево могло быть собрано сборщиком мусора в версиях Python без циклического GC. Даже когда циклический GC доступен, его использование может освободить большие объёмы памяти раньше, поэтому вызов этого метода на DOM-объектах, как только они больше не нужны, является хорошей практикой. Этот метод нужно вызывать только на объекте `Document`, но можно вызывать и на дочерних узлах, чтобы удалить их потомков.8788Можно избежать явного вызова этого метода, используя оператор [`with`](https://python-all.ru/3.2/reference/compound_stmts.html#with). Следующий код автоматически вызовет unlink для *dom* при выходе из блока [`with`](https://python-all.ru/3.2/reference/compound_stmts.html#with):8990```python91with xml.dom.minidom.parse(datasource) as dom:92    ... # Работать с DOM.93```9495#### `Node.writexml(writer, indent="", addindent="", newl="")`9697Записывает XML в объект writer. Writer должен иметь метод `write()`, соответствующий интерфейсу файлового объекта. Параметр *indent* задаёт отступ текущего узла. Параметр *addindent* задаёт дополнительный отступ для подузлов текущего узла. Параметр *newl* задаёт строку, используемую для завершения строк.9899Для узла `Document` можно использовать дополнительный именованный аргумент *encoding* для указания поля кодировки в заголовке XML.100101#### `Node.toxml(encoding=None)`102103Возвращает строку или байтовую строку, содержащую XML, представленный узлом DOM.104105При явном указании аргумента *encoding* [\[1\]](https://python-all.ru/3.2/library/xml.dom.minidom.html#id3) результатом будет байтовая строка в указанной кодировке. Рекомендуется всегда указывать кодировку; можно использовать любую, но аргумент «utf-8» – самый распространённый выбор, позволяющий избежать исключений [`UnicodeError`](https://python-all.ru/3.2/library/exceptions.html#UnicodeError) при наличии непредставимых текстовых данных.106107Без аргумента *encoding* результатом будет строка Unicode, и XML-объявление в результирующей строке не указывает кодировку. Кодирование этой строки в кодировке, отличной от UTF-8, скорее всего, некорректно, так как UTF-8 является кодировкой XML по умолчанию.108109#### `Node.toprettyxml(indent="", newl="", encoding="")`110111Возвращает красиво отформатированную версию документа. *indent* задаёт строку отступа; по умолчанию это табуляция. *newl* задаёт строку, добавляемую в конце каждой строки; по умолчанию это `\n`.112113Аргумент *encoding* ведёт себя так же, как соответствующий аргумент функции [`toxml()`](https://python-all.ru/3.2/library/xml.dom.minidom.html#xml.dom.minidom.Node.toxml).114115## 19.8.2. Пример DOM116117Эта примерная программа – довольно реалистичный пример простой программы. В данном конкретном случае мы не используем гибкость DOM в полной мере.118119```python120import xml.dom.minidom121122document = """\123<slideshow>124<title>Demo slideshow</title>125<slide><title>Slide title</title>126<point>This is a demo</point>127<point>Of a program for processing slides</point>128</slide>129130<slide><title>Another demo slide</title>131<point>It is important</point>132<point>To have more than</point>133<point>one slide</point>134</slide>135</slideshow>136"""137138dom = xml.dom.minidom.parseString(document)139140def getText(nodelist):141    rc = []142    for node in nodelist:143        if node.nodeType == node.TEXT_NODE:144            rc.append(node.data)145    return ''.join(rc)146147def handleSlideshow(slideshow):148    print("<html>")149    handleSlideshowTitle(slideshow.getElementsByTagName("title")[0])150    slides = slideshow.getElementsByTagName("slide")151    handleToc(slides)152    handleSlides(slides)153    print("</html>")154155def handleSlides(slides):156    for slide in slides:157        handleSlide(slide)158159def handleSlide(slide):160    handleSlideTitle(slide.getElementsByTagName("title")[0])161    handlePoints(slide.getElementsByTagName("point"))162163def handleSlideshowTitle(title):164    print("<title>%s</title>" % getText(title.childNodes))165166def handleSlideTitle(title):167    print("<h2>%s</h2>" % getText(title.childNodes))168169def handlePoints(points):170    print("<ul>")171    for point in points:172        handlePoint(point)173    print("</ul>")174175def handlePoint(point):176    print("<li>%s</li>" % getText(point.childNodes))177178def handleToc(slides):179    for slide in slides:180        title = slide.getElementsByTagName("title")[0]181        print("<p>%s</p>" % getText(title.childNodes))182183handleSlideshow(dom)184```185186## 19.8.3. minidom и стандарт DOM187188Модуль [`xml.dom.minidom`](https://python-all.ru/3.2/library/xml.dom.minidom.html#module-xml.dom.minidom), по сути, является DOM, совместимым с DOM 1.0, с некоторыми функциями DOM 2 (в основном связанными с пространствами имён).189190Использование интерфейса DOM в Python интуитивно понятно. Применяются следующие правила отображения:191192- Интерфейсы доступны через объекты экземпляров. Приложения не должны создавать экземпляры классов напрямую; вместо этого следует использовать функции-создатели, доступные на объекте `Document`. Производные интерфейсы поддерживают все операции (и атрибуты) базовых интерфейсов, а также любые новые операции.193- Операции используются как методы. Поскольку DOM использует только параметры [`in`](https://python-all.ru/3.2/reference/expressions.html#in), аргументы передаются в обычном порядке (слева направо). Необязательных аргументов нет. Операции `void` возвращают `None`.194- Атрибуты IDL отображаются на атрибуты экземпляров. Для совместимости с отображением языка OMG IDL для Python атрибут `foo` можно также получать через методы доступа `_get_foo()` и `_set_foo()`. Атрибуты `readonly` нельзя изменять; это не контролируется во время выполнения.195- Типы `short int`, `unsigned int`, `unsigned long long` и `boolean` отображаются на целочисленные объекты Python.196- Тип `DOMString` отображается на строки Python. [`xml.dom.minidom`](https://python-all.ru/3.2/library/xml.dom.minidom.html#module-xml.dom.minidom) поддерживает как байтовые строки, так и обычные строки, но обычно возвращает строки. Значения типа `DOMString` также могут быть `None`, если спецификация DOM от W3C допускает значение IDL `null`.197- Объявления `const` отображаются на переменные в соответствующей области видимости (например, `xml.dom.minidom.Node.PROCESSING_INSTRUCTION_NODE`); их нельзя изменять.198- `DOMException` в настоящее время не поддерживается в [`xml.dom.minidom`](https://python-all.ru/3.2/library/xml.dom.minidom.html#module-xml.dom.minidom). Вместо этого [`xml.dom.minidom`](https://python-all.ru/3.2/library/xml.dom.minidom.html#module-xml.dom.minidom) использует стандартные исключения Python, такие как [`TypeError`](https://python-all.ru/3.2/library/exceptions.html#TypeError) и [`AttributeError`](https://python-all.ru/3.2/library/exceptions.html#AttributeError).199- Объекты `NodeList` реализованы с использованием встроенного типа списка Python. Эти объекты предоставляют интерфейс, определённый в спецификации DOM, но в более ранних версиях Python они не поддерживают официальный API. Однако они гораздо более «питоновские», чем интерфейс, определённый в рекомендациях W3C.200201Следующие интерфейсы не имеют реализации в [`xml.dom.minidom`](https://python-all.ru/3.2/library/xml.dom.minidom.html#module-xml.dom.minidom):202203- `DOMTimeStamp`204- `DocumentType`205- `DOMImplementation`206- `CharacterData`207- `CDATASection`208- `Notation`209- `Entity`210- `EntityReference`211- `DocumentFragment`212213Большинство из них отражают информацию в XML-документе, которая не представляет общей ценности для большинства пользователей DOM.214215Сноски216217| \[1\] | Имя кодировки, указываемое в XML-выводе, должно соответствовать соответствующим стандартам. Например, «UTF-8» допустимо, но «UTF8» недопустимо в объявлении XML-документа, хотя Python принимает его как имя кодировки. См. [http://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl](https://python-all.ru/3.2/library/xml.dom.minidom.html) и [http://www.iana.org/assignments/character-sets](https://python-all.ru/3.2/library/xml.dom.minidom.html). |218| --- | --- |219