xml.dom.minidom.md
1> **Источник:** https://python-all.ru/3.0/library/xml.dom.minidom.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `xml.dom.minidom` – Лёгкая реализация DOM89`xml.dom.minidom` – это легковесная реализация интерфейса Document Object Model. Она задумана как более простая, чем полный DOM, и при этом значительно меньше по размеру.1011Приложения DOM обычно начинаются с разбора XML в DOM. В `xml.dom.minidom` это делается с помощью функций parse:1213```python14from xml.dom.minidom import parse, parseString1516dom1 = parse('c:\\temp\\mydata.xml') # разобрать XML-файл по имени1718datasource = open('c:\\temp\\mydata.xml')19dom2 = parse(datasource) # разобрать открытый файл2021dom3 = parseString('<myxml>Some data<empty/> some more data</myxml>')22```2324Функция [`parse()`](https://python-all.ru/3.0/library/xml.dom.minidom.html#xml.dom.minidom.parse) может принимать либо имя файла, либо открытый файловый объект.2526#### `[xml.dom.minidom.parse]xml.dom.minidom.parse(filename_or_file, parser)`2728Возвращает2930`Document`3132из переданных данных.3334*filename\_or\_file*3536может быть как именем файла, так и объектом, похожим на файл.3738*parser*3940, если задан, должен быть объектом парсера SAX2. Эта функция изменит обработчик документа парсера и активирует поддержку пространств имён; другие настройки парсера (например, установка резолвера сущностей) должны быть выполнены заранее.4142Если XML находится в строке, можно использовать функцию [`parseString()`](https://python-all.ru/3.0/library/xml.dom.minidom.html#xml.dom.minidom.parseString) вместо этого:4344#### `[xml.dom.minidom.parseString]xml.dom.minidom.parseString(string[, parser])`4546Возвращает объект4748`Document`4950, представляющий5152*строку*5354. Этот метод создаёт объект5556`StringIO`5758для строки и передаёт его в5960[`parse()`](https://python-all.ru/3.0/library/xml.dom.minidom.html#xml.dom.minidom.parse)6162.6364Обе функции возвращают объект `Document`, представляющий содержимое документа.6566Функции [`parse()`](https://python-all.ru/3.0/library/xml.dom.minidom.html#xml.dom.minidom.parse) и [`parseString()`](https://python-all.ru/3.0/library/xml.dom.minidom.html#xml.dom.minidom.parseString) подключают XML-парсер к «построителю DOM», который может принимать события парсинга от любого SAX-парсера и преобразовывать их в DOM-дерево. Названия функций, возможно, вводят в заблуждение, но их легко понять при изучении интерфейсов. Разбор документа завершается до возврата из этих функций; просто сами функции не предоставляют реализацию парсера.6768`Document` можно также создать, вызвав метод у объекта «DOM Implementation». Этот объект можно получить, вызвав функцию `getDOMImplementation()` в пакете [`xml.dom`](https://python-all.ru/3.0/library/xml.dom.html#module-xml.dom) или модуле `xml.dom.minidom`. Использование реализации из модуля `xml.dom.minidom` всегда возвращает экземпляр `Document` из реализации minidom, тогда как версия из [`xml.dom`](https://python-all.ru/3.0/library/xml.dom.html#module-xml.dom) может предоставить альтернативную реализацию (это вероятно, если установлен пакет [PyXML package](https://python-all.ru/3.0/library/xml.dom.minidom.html)). Когда у вас есть `Document`, можно добавлять к нему дочерние узлы, чтобы наполнить DOM:6970```python71from xml.dom.minidom import getDOMImplementation7273impl = getDOMImplementation()7475newdoc = impl.createDocument(None, "some_tag", None)76top_element = newdoc.documentElement77text = newdoc.createTextNode('Some textual content.')78top_element.appendChild(text)79```8081Получив объект DOM-документа, можно обращаться к частям XML-документа через его свойства и методы. Эти свойства определены в спецификации DOM. Основным свойством объекта документа является свойство `documentElement`. Оно даёт основной элемент XML-документа: тот, который содержит все остальные. Вот пример программы:8283```python84dom3 = parseString("<myxml>Some data</myxml>")85assert dom3.documentElement.tagName == "myxml"86```8788После завершения работы с DOM её следует очистить. Это необходимо, потому что некоторые версии Python не поддерживают сборку мусора для объектов, циклически ссылающихся друг на друга. Пока это ограничение не устранено во всех версиях Python, безопаснее всего писать код так, как если бы циклы не очищались.8990Чтобы очистить DOM, следует вызвать его метод `unlink()`:9192```python93dom1.unlink()94dom2.unlink()95dom3.unlink()96```9798`unlink()` – это расширение DOM API, специфичное для `xml.dom.minidom`. После вызова `unlink()` на узле узел и его потомки становятся, по сути, бесполезными.99100> **См. также**101>102> **[Спецификация объектной модели документа (DOM) уровня 1](https://python-all.ru/3.0/library/xml.dom.minidom.html)**103>104> Рекомендация W3C для DOM, поддерживаемого105>106> `xml.dom.minidom`107>108> .109110## Объекты DOM111112Определение DOM API для Python приведено в документации модуля [`xml.dom`](https://python-all.ru/3.0/library/xml.dom.html#module-xml.dom). В этом разделе перечислены различия между API и `xml.dom.minidom`.113114#### `[xml.dom.minidom.Node.unlink]Node.unlink()`115116Разрывает внутренние ссылки в DOM, чтобы дерево могло быть собрано сборщиком мусора в версиях Python без циклического GC. Даже когда циклический GC доступен, его использование может освободить большие объёмы памяти раньше, поэтому вызов этого метода на DOM-объектах, как только они больше не нужны, является хорошей практикой. Этот метод нужно вызывать только на объекте117118`Document`119120, но можно вызывать и на дочерних узлах, чтобы удалить их потомков.121122#### `[xml.dom.minidom.Node.writexml]Node.writexml(writer[, indent=""[, addindent=""[, newl=""[, encoding=""]]]])`123124Записывает XML в объект writer. Writer должен иметь метод `write()`, соответствующий интерфейсу файлового объекта. Параметр *indent* задаёт отступ текущего узла. Параметр *addindent* задаёт дополнительный отступ для подузлов текущего узла. Параметр *newl* задаёт строку, используемую для завершения строк.125126Для узла `Document` можно использовать дополнительный именованный аргумент *encoding*, чтобы указать поле кодировки в заголовке XML.127128#### `[xml.dom.minidom.Node.toxml]Node.toxml([encoding])`129130Возвращает XML-представление DOM в виде строки.131132Если аргументы не переданы, заголовок XML не указывает кодировку, и результатом будет строка Unicode, если кодировка по умолчанию не может представить все символы документа. Кодирование этой строки в кодировке, отличной от UTF-8, скорее всего, некорректно, поскольку UTF-8 – это кодировка XML по умолчанию.133134При явном указании аргумента *encoding* [\[1\]](https://python-all.ru/3.0/library/xml.dom.minidom.html#id3) результатом будет байтовая строка в указанной кодировке. Рекомендуется всегда указывать этот аргумент. Чтобы избежать исключений [`UnicodeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.UnicodeError) при наличии непредставимых текстовых данных, аргумент encoding следует задать как “utf-8”.135136#### `[xml.dom.minidom.Node.toprettyxml]Node.toprettyxml([indent=""[, newl=""[, encoding=""]]])`137138Возвращает красиво отформатированную версию документа. *indent* задаёт строку отступа; по умолчанию это табуляция. *newl* задаёт строку, добавляемую в конце каждой строки; по умолчанию это `\n`.139140Также имеется аргумент *encoding*; см. [`toxml()`](https://python-all.ru/3.0/library/xml.dom.minidom.html#xml.dom.minidom.Node.toxml).141142## Пример DOM143144Эта примерная программа – довольно реалистичный пример простой программы. В данном конкретном случае мы не используем гибкость DOM в полной мере.145146```python147import xml.dom.minidom148149document = """\150<slideshow>151<title>Demo slideshow</title>152<slide><title>Slide title</title>153<point>This is a demo</point>154<point>Of a program for processing slides</point>155</slide>156157<slide><title>Another demo slide</title>158<point>It is important</point>159<point>To have more than</point>160<point>one slide</point>161</slide>162</slideshow>163"""164165dom = xml.dom.minidom.parseString(document)166167def getText(nodelist):168 rc = ""169 for node in nodelist:170 if node.nodeType == node.TEXT_NODE:171 rc = rc + node.data172 return rc173174def handleSlideshow(slideshow):175 print("<html>")176 handleSlideshowTitle(slideshow.getElementsByTagName("title")[0])177 slides = slideshow.getElementsByTagName("slide")178 handleToc(slides)179 handleSlides(slides)180 print("</html>")181182def handleSlides(slides):183 for slide in slides:184 handleSlide(slide)185186def handleSlide(slide):187 handleSlideTitle(slide.getElementsByTagName("title")[0])188 handlePoints(slide.getElementsByTagName("point"))189190def handleSlideshowTitle(title):191 print("<title>%s</title>" % getText(title.childNodes))192193def handleSlideTitle(title):194 print("<h2>%s</h2>" % getText(title.childNodes))195196def handlePoints(points):197 print("<ul>")198 for point in points:199 handlePoint(point)200 print("</ul>")201202def handlePoint(point):203 print("<li>%s</li>" % getText(point.childNodes))204205def handleToc(slides):206 for slide in slides:207 title = slide.getElementsByTagName("title")[0]208 print("<p>%s</p>" % getText(title.childNodes))209210handleSlideshow(dom)211```212213## minidom и стандарт DOM214215Модуль `xml.dom.minidom` по сути является DOM, совместимым с DOM 1.0, с некоторыми возможностями DOM 2 (в основном, связанными с пространствами имён).216217Использование интерфейса DOM в Python интуитивно понятно. Применяются следующие правила отображения:218219- Интерфейсы доступны через объекты экземпляров. Приложения не должны создавать экземпляры классов напрямую; вместо этого следует использовать функции-создатели, доступные на объекте `Document`. Производные интерфейсы поддерживают все операции (и атрибуты) базовых интерфейсов, а также любые новые операции.220- Операции используются как методы. Поскольку DOM использует только параметры [`in`](https://python-all.ru/3.0/reference/expressions.html#in), аргументы передаются в обычном порядке (слева направо). Необязательных аргументов нет. Операции `void` возвращают `None`.221- Атрибуты IDL отображаются на атрибуты экземпляров. Для совместимости с отображением языка OMG IDL для Python атрибут `foo` можно также получать через методы доступа `_get_foo()` и `_set_foo()`. Атрибуты `readonly` нельзя изменять; это не контролируется во время выполнения.222- Типы `short int`, `unsigned int`, `unsigned long long` и `boolean` отображаются на целочисленные объекты Python.223- Тип `DOMString` отображается на строки Python. `xml.dom.minidom` поддерживает как байты, так и строки, но обычно возвращает строки. Значения типа `DOMString` также могут быть `None`, если это допускается спецификацией DOM от W3C для значения IDL `null`.224- Объявления `const` отображаются на переменные в соответствующей области видимости (например, `xml.dom.minidom.Node.PROCESSING_INSTRUCTION_NODE`); их нельзя изменять.225- `DOMException` в настоящее время не поддерживается в `xml.dom.minidom`. Вместо этого `xml.dom.minidom` использует стандартные исключения Python, такие как [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError) и [`AttributeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.AttributeError).226- Объекты `NodeList` реализованы с использованием встроенного типа списка Python. Эти объекты предоставляют интерфейс, определённый в спецификации DOM, но в более ранних версиях Python они не поддерживают официальный API. Однако они гораздо более «питоновские», чем интерфейс, определённый в рекомендациях W3C.227228Следующие интерфейсы не реализованы в `xml.dom.minidom`:229230- `DOMTimeStamp`231- `DocumentType`232- `DOMImplementation`233- `CharacterData`234- `CDATASection`235- `Нотация`236- `Сущность`237- `Ссылка на сущность`238- `Фрагмент документа`239240Большинство из них отражают информацию в XML-документе, которая не представляет общей ценности для большинства пользователей DOM.241242Сноски243244| \[1\] | Строка кодировки, включённая в вывод XML, должна соответствовать соответствующим стандартам. Например, «UTF-8» допустимо, а «UTF8» – нет. См. [http://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl](https://python-all.ru/3.0/library/xml.dom.minidom.html) и [http://www.iana.org/assignments/character-sets](https://python-all.ru/3.0/library/xml.dom.minidom.html) . |245| --- | --- |246