xml.dom.minidom.md
1> **Источник:** https://python-all.ru/2.7/library/xml.dom.minidom.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 19.9. [`xml.dom.minidom`](https://python-all.ru/2.7/library/xml.dom.minidom.html#module-xml.dom.minidom) – Минимальная реализация DOM89Новое в версии 2.0.1011**Исходный код:** [Lib/xml/dom/minidom.py](https://python-all.ru/src/2.7/Lib/xml/dom/minidom.py)1213---1415[`xml.dom.minidom`](https://python-all.ru/2.7/library/xml.dom.minidom.html#module-xml.dom.minidom) – это минимальная реализация интерфейса Document Object Model с API, похожим на API в других языках. Она призвана быть проще, чем полный DOM, и значительно меньше. Пользователям, которые ещё недостаточно знакомы с DOM, стоит рассмотреть использование модуля [`xml.etree.ElementTree`](https://python-all.ru/2.7/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) для обработки XML.1617> **Предупреждение**18>19> Модуль [`xml.dom.minidom`](https://python-all.ru/2.7/library/xml.dom.minidom.html#module-xml.dom.minidom) не защищён от вредоносных данных. Если нужно разобрать непроверенные или неаутентифицированные данные, см. [уязвимости XML](https://python-all.ru/2.7/library/xml.html#xml-vulnerabilities).2021Приложения, работающие с DOM, обычно начинают с разбора XML в DOM. С [`xml.dom.minidom`](https://python-all.ru/2.7/library/xml.dom.minidom.html#module-xml.dom.minidom) это делается с помощью функций parse:2223```python24from xml.dom.minidom import parse, parseString2526dom1 = parse('c:\\temp\\mydata.xml') # разобрать XML-файл по имени2728datasource = open('c:\\temp\\mydata.xml')29dom2 = parse(datasource) # разобрать открытый файл3031dom3 = parseString('<myxml>Some data<empty/> some more data</myxml>')32```3334Функция [`parse()`](https://python-all.ru/2.7/library/xml.dom.minidom.html#xml.dom.minidom.parse) может принимать имя файла или открытый файловый объект.3536#### `xml.dom.minidom.parse(filename_or_file[, parser[, bufsize]])`3738Возвращает `Document` из переданных входных данных. *filename\_or\_file* может быть либо именем файла, либо объектом, похожим на файл. *parser*, если указан, должен быть объектом парсера SAX2. Эта функция изменит обработчик документа парсера и включит поддержку пространств имён; остальные настройки парсера (например, установка обработчика сущностей) должны быть выполнены заранее.3940Если XML находится в строке, можно использовать функцию [`parseString()`](https://python-all.ru/2.7/library/xml.dom.minidom.html#xml.dom.minidom.parseString) вместо этого:4142#### `xml.dom.minidom.parseString(string[, parser])`4344Возвращает объект `Document`, представляющий *строку*. Этот метод создаёт объект [`StringIO`](https://python-all.ru/2.7/library/stringio.html#StringIO.StringIO) для строки и передаёт его в [`parse()`](https://python-all.ru/2.7/library/xml.dom.minidom.html#xml.dom.minidom.parse).4546Обе функции возвращают объект `Document`, представляющий содержимое документа.4748Функции [`parse()`](https://python-all.ru/2.7/library/xml.dom.minidom.html#xml.dom.minidom.parse) и [`parseString()`](https://python-all.ru/2.7/library/xml.dom.minidom.html#xml.dom.minidom.parseString) связывают XML парсер с «DOM-построителем», который может принимать события разбора от любого SAX-парсера и преобразовывать их в DOM-дерево. Названия функций, возможно, вводят в заблуждение, но их легко понять при изучении интерфейсов. Разбор документа завершится до того, как эти функции вернут управление; просто эти функции сами не предоставляют реализацию парсера.4950Также можно создать объект `Document`, вызвав метод у объекта «DOM Implementation». Этот объект можно получить, вызвав функцию `getDOMImplementation()` в пакете [`xml.dom`](https://python-all.ru/2.7/library/xml.dom.html#module-xml.dom) или модуле [`xml.dom.minidom`](https://python-all.ru/2.7/library/xml.dom.minidom.html#module-xml.dom.minidom). Использование реализации из модуля [`xml.dom.minidom`](https://python-all.ru/2.7/library/xml.dom.minidom.html#module-xml.dom.minidom) всегда возвращает экземпляр `Document` из реализации minidom, тогда как версия из [`xml.dom`](https://python-all.ru/2.7/library/xml.dom.html#module-xml.dom) может предоставить альтернативную реализацию (это вероятно, если установлен [пакет PyXML](https://python-all.ru/2.7/library/xml.dom.minidom.html)). Получив объект `Document`, можно добавлять к нему дочерние узлы, чтобы наполнить DOM:5152```python53from xml.dom.minidom import getDOMImplementation5455impl = getDOMImplementation()5657newdoc = impl.createDocument(None, "some_tag", None)58top_element = newdoc.documentElement59text = newdoc.createTextNode('Some textual content.')60top_element.appendChild(text)61```6263Получив объект DOM-документа, можно обращаться к частям XML-документа через его свойства и методы. Эти свойства определены в спецификации DOM. Основное свойство объекта документа – это свойство `documentElement`. Оно даёт доступ к корневому элементу XML-документа: тому, который содержит все остальные. Вот пример программы:6465```python66dom3 = parseString("<myxml>Some data</myxml>")67assert dom3.documentElement.tagName == "myxml"68```6970Когда работа с DOM-деревом завершена, можно дополнительно вызвать метод `unlink()`, чтобы стимулировать раннюю очистку более не нужных объектов. `unlink()` – это [`xml.dom.minidom`](https://python-all.ru/2.7/library/xml.dom.minidom.html#module-xml.dom.minidom)-специфичное расширение DOM API, которое делает узел и его потомков фактически бесполезными. В противном случае сборщик мусора Python в конечном итоге позаботится об объектах в дереве.7172> **См. также**73>74> **[Спецификация объектной модели документа (DOM) уровня 1](https://python-all.ru/2.7/library/xml.dom.minidom.html)**75>76> Рекомендация W3C для DOM, поддерживаемая [`xml.dom.minidom`](https://python-all.ru/2.7/library/xml.dom.minidom.html#module-xml.dom.minidom).7778## 19.9.1. Объекты DOM7980Определение DOM API для Python даётся как часть документации модуля [`xml.dom`](https://python-all.ru/2.7/library/xml.dom.html#module-xml.dom). В этом разделе перечислены отличия между API и [`xml.dom.minidom`](https://python-all.ru/2.7/library/xml.dom.minidom.html#module-xml.dom.minidom).8182#### `Node.unlink()`8384Разрывает внутренние ссылки внутри DOM, чтобы он мог быть собран сборщиком мусора на версиях Python без циклического GC. Даже если циклический GC доступен, использование этого метода может освободить большие объёмы памяти раньше, поэтому вызов его для DOM-объектов, как только они больше не нужны, является хорошей практикой. Этот метод нужно вызывать только для объекта `Document`, но его можно вызывать и для дочерних узлов, чтобы удалить потомков этого узла.8586#### `Node.writexml(writer, indent="", addindent="", newl="")`8788Записывает XML в объект writer. Объект writer должен иметь метод `write()`, который соответствует интерфейсу файлового объекта. Параметр *indent* задаёт отступ текущего узла. Параметр *addindent* – дополнительный отступ для дочерних узлов текущего. Параметр *newl* определяет строку, используемую для завершения строк.8990Для узла `Document` можно использовать дополнительный именованный аргумент *encoding* для указания поля кодировки в заголовке XML.9192Изменено в версии 2.1: Были добавлены необязательные именованные параметры *indent*, *addindent* и *newl* для поддержки форматированного вывода.9394Изменено в версии 2.3: Для узла `Document` можно использовать дополнительный именованный аргумент *encoding*, чтобы указать поле кодировки в заголовке XML.9596#### `Node.toxml([encoding])`9798Возвращает XML-представление DOM в виде строки.99100Если аргументы не переданы, заголовок XML не указывает кодировку, и результатом будет строка Unicode, если кодировка по умолчанию не может представить все символы документа. Кодирование этой строки в кодировке, отличной от UTF-8, скорее всего, некорректно, поскольку UTF-8 – это кодировка XML по умолчанию.101102При явном указании *encoding* [1](https://python-all.ru/2.7/library/xml.dom.minidom.html#id3) аргумента результатом является байтовая строка в указанной кодировке. Рекомендуется всегда указывать этот аргумент. Чтобы избежать исключений [`UnicodeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.UnicodeError) в случае непредставимых текстовых данных, аргумент encoding следует указывать как «utf-8».103104Изменено в версии 2.3: добавлен аргумент *encoding*; см. [`writexml()`](https://python-all.ru/2.7/library/xml.dom.minidom.html#xml.dom.minidom.Node.writexml).105106#### `Node.toprettyxml(indent="\t", newl="\n", encoding=None)`107108Возвращает версию документа с красивым форматированием. *indent* задаёт строку отступа, по умолчанию – символ табуляции; *newl* задаёт строку, добавляемую в конце каждой строки, по умолчанию `\n`.109110Новое в версии 2.1.111112Изменено в версии 2.3: добавлен аргумент encoding; см. [`writexml()`](https://python-all.ru/2.7/library/xml.dom.minidom.html#xml.dom.minidom.Node.writexml).113114Следующие стандартные методы DOM имеют особенности при работе с [`xml.dom.minidom`](https://python-all.ru/2.7/library/xml.dom.minidom.html#module-xml.dom.minidom):115116#### `Node.cloneNode(deep)`117118Хотя этот метод присутствовал в версии [`xml.dom.minidom`](https://python-all.ru/2.7/library/xml.dom.minidom.html#module-xml.dom.minidom), поставляемой с Python 2.0, он был серьёзно сломан. Это было исправлено в последующих выпусках.119120## 19.9.2. Пример DOM121122Эта примерная программа – довольно реалистичный пример простой программы. В данном конкретном случае мы не используем гибкость DOM в полной мере.123124```python125import xml.dom.minidom126127document = """\128<slideshow>129<title>Demo slideshow</title>130<slide><title>Slide title</title>131<point>This is a demo</point>132<point>Of a program for processing slides</point>133</slide>134135<slide><title>Another demo slide</title>136<point>It is important</point>137<point>To have more than</point>138<point>one slide</point>139</slide>140</slideshow>141"""142143dom = xml.dom.minidom.parseString(document)144145def getText(nodelist):146 rc = []147 for node in nodelist:148 if node.nodeType == node.TEXT_NODE:149 rc.append(node.data)150 return ''.join(rc)151152def handleSlideshow(slideshow):153 print "<html>"154 handleSlideshowTitle(slideshow.getElementsByTagName("title")[0])155 slides = slideshow.getElementsByTagName("slide")156 handleToc(slides)157 handleSlides(slides)158 print "</html>"159160def handleSlides(slides):161 for slide in slides:162 handleSlide(slide)163164def handleSlide(slide):165 handleSlideTitle(slide.getElementsByTagName("title")[0])166 handlePoints(slide.getElementsByTagName("point"))167168def handleSlideshowTitle(title):169 print "<title>%s</title>" % getText(title.childNodes)170171def handleSlideTitle(title):172 print "<h2>%s</h2>" % getText(title.childNodes)173174def handlePoints(points):175 print "<ul>"176 for point in points:177 handlePoint(point)178 print "</ul>"179180def handlePoint(point):181 print "<li>%s</li>" % getText(point.childNodes)182183def handleToc(slides):184 for slide in slides:185 title = slide.getElementsByTagName("title")[0]186 print "<p>%s</p>" % getText(title.childNodes)187188handleSlideshow(dom)189```190191## 19.9.3. minidom и стандарт DOM192193Модуль [`xml.dom.minidom`](https://python-all.ru/2.7/library/xml.dom.minidom.html#module-xml.dom.minidom) по сути является DOM, совместимым с DOM 1.0, с некоторыми возможностями DOM 2 (в первую очередь, поддержкой пространств имён).194195Использование интерфейса DOM в Python интуитивно понятно. Применяются следующие правила отображения:196197- Интерфейсы доступны через объекты экземпляров. Приложения не должны создавать экземпляры классов напрямую – для этого следует использовать функции-создатели, доступные на объекте `Document`. Производные интерфейсы поддерживают все операции (и атрибуты) базовых интерфейсов, а также любые новые операции.198- Операции используются как методы. Поскольку DOM использует только параметры [`in`](https://python-all.ru/2.7/reference/expressions.html#in), аргументы передаются в обычном порядке (слева направо). Необязательных аргументов нет. Операции `void` возвращают `None`.199- Атрибуты IDL отображаются в атрибуты экземпляра. Для совместимости с отображением языка OMG IDL для Python, атрибут `foo` также может быть доступен через методы доступа `_get_foo()` и `_set_foo()`. `readonly` атрибуты не должны изменяться; во время выполнения это не контролируется.200- Типы `short int`, `unsigned int`, `unsigned long long` и `boolean` все отображаются на целочисленные объекты Python.201- Тип `DOMString` отображается на строки Python. [`xml.dom.minidom`](https://python-all.ru/2.7/library/xml.dom.minidom.html#module-xml.dom.minidom) поддерживает как байтовые, так и строки Unicode, но обычно создаёт строки Unicode. Значения типа `DOMString` также могут быть `None`, если это допускается спецификацией DOM от W3C для значений IDL `null`.202- Объявления `const` отображаются на переменные в соответствующей области видимости (например, `xml.dom.minidom.Node.PROCESSING_INSTRUCTION_NODE`); они не должны изменяться.203- `DOMException` в настоящее время не поддерживается в [`xml.dom.minidom`](https://python-all.ru/2.7/library/xml.dom.minidom.html#module-xml.dom.minidom). Вместо этого [`xml.dom.minidom`](https://python-all.ru/2.7/library/xml.dom.minidom.html#module-xml.dom.minidom) использует стандартные исключения Python, такие как [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError) и [`AttributeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.AttributeError).204- Объекты `NodeList` реализованы с использованием встроенного типа list Python. Начиная с Python 2.2, эти объекты предоставляют интерфейс, определённый в спецификации DOM, но в более ранних версиях Python они не поддерживают официальный API. Однако они гораздо более «Pythonic», чем интерфейс, определённый в рекомендациях W3C.205206Следующие интерфейсы не имеют реализации в [`xml.dom.minidom`](https://python-all.ru/2.7/library/xml.dom.minidom.html#module-xml.dom.minidom):207208- `DOMTimeStamp`209- `DocumentType` (добавлено в Python 2.1)210- `DOMImplementation` (добавлено в Python 2.1)211- `CharacterData`212- `CDATASection`213- `Notation`214- `Entity`215- `EntityReference`216- `DocumentFragment`217218Большинство из них отражают информацию в XML-документе, которая не представляет общей ценности для большинства пользователей DOM.219220Сноски221222**[1](https://python-all.ru/2.7/library/xml.dom.minidom.html#id1)**223224Строка кодировки, указанная в XML-выводе, должна соответствовать соответствующим стандартам. Например, «UTF-8» допустимо, а «UTF8» – нет. См. [https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl](https://python-all.ru/2.7/library/xml.dom.minidom.html) и [https://www.iana.org/assignments/character-sets/character-sets.xhtml](https://python-all.ru/2.7/library/xml.dom.minidom.html).225