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

xml.dom.minidom.md

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

1> **Источник:** https://python-all.ru/3.8/library/xml.dom.minidom.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`xml.dom.minidom`](https://python-all.ru/3.8/library/xml.dom.minidom.html#module-xml.dom.minidom) – Минимальная реализация DOM89**Исходный код:** [Lib/xml/dom/minidom.py](https://python-all.ru/src/3.8/Lib/xml/dom/minidom.py)1011---1213[`xml.dom.minidom`](https://python-all.ru/3.8/library/xml.dom.minidom.html#module-xml.dom.minidom) – это минимальная реализация интерфейса Document Object Model с API, похожим на API в других языках. Она призвана быть проще, чем полный DOM, и значительно меньше. Пользователям, которые ещё недостаточно знакомы с DOM, стоит рассмотреть использование модуля [`xml.etree.ElementTree`](https://python-all.ru/3.8/library/xml.etree.elementtree.html#module-xml.etree.ElementTree) для обработки XML.1415> **Предупреждение**16>17> Модуль [`xml.dom.minidom`](https://python-all.ru/3.8/library/xml.dom.minidom.html#module-xml.dom.minidom) не защищён от вредоносных данных. Если нужно разобрать непроверенные или неаутентифицированные данные, см. [уязвимости XML](https://python-all.ru/3.8/library/xml.html#xml-vulnerabilities).1819Приложения, работающие с DOM, обычно начинают с разбора XML в DOM. С [`xml.dom.minidom`](https://python-all.ru/3.8/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.8/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.8/library/xml.dom.minidom.html#xml.dom.minidom.parseString) вместо этого:3940#### `xml.dom.minidom.parseString(string, parser=None)`4142Возвращает `Document`, представляющий *строку*. Этот метод создаёт объект [`io.StringIO`](https://python-all.ru/3.8/library/io.html#io.StringIO) для строки и передаёт его в [`parse()`](https://python-all.ru/3.8/library/xml.dom.minidom.html#xml.dom.minidom.parse).4344Обе функции возвращают объект `Document`, представляющий содержимое документа.4546Функции [`parse()`](https://python-all.ru/3.8/library/xml.dom.minidom.html#xml.dom.minidom.parse) и [`parseString()`](https://python-all.ru/3.8/library/xml.dom.minidom.html#xml.dom.minidom.parseString) связывают XML парсер с «DOM-построителем», который может принимать события разбора от любого SAX-парсера и преобразовывать их в DOM-дерево. Названия функций, возможно, вводят в заблуждение, но их легко понять при изучении интерфейсов. Разбор документа завершится до того, как эти функции вернут управление; просто эти функции сами не предоставляют реализацию парсера.4748Можно также создать `Document`, вызвав метод объекта «DOM Implementation» (реализация DOM). Получить этот объект можно либо вызовом функции `getDOMImplementation()` в пакете [`xml.dom`](https://python-all.ru/3.8/library/xml.dom.html#module-xml.dom), либо в модуле [`xml.dom.minidom`](https://python-all.ru/3.8/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()` – это [`xml.dom.minidom`](https://python-all.ru/3.8/library/xml.dom.minidom.html#module-xml.dom.minidom)-специфичное расширение DOM API, которое делает узел и его потомков фактически бесполезными. В противном случае сборщик мусора Python в конечном итоге позаботится об объектах в дереве.6970> **См. также**71>72> **[Спецификация объектной модели документа (DOM) уровня 1](https://python-all.ru/3.8/library/xml.dom.minidom.html)**73>74> Рекомендация W3C для DOM, поддерживаемая [`xml.dom.minidom`](https://python-all.ru/3.8/library/xml.dom.minidom.html#module-xml.dom.minidom).7576## Объекты DOM7778Определение DOM API для Python даётся как часть документации модуля [`xml.dom`](https://python-all.ru/3.8/library/xml.dom.html#module-xml.dom). В этом разделе перечислены отличия между API и [`xml.dom.minidom`](https://python-all.ru/3.8/library/xml.dom.minidom.html#module-xml.dom.minidom).7980#### `Node.unlink()`8182Разрывает внутренние ссылки внутри DOM, чтобы он мог быть собран сборщиком мусора на версиях Python без циклического GC. Даже если циклический GC доступен, использование этого метода может освободить большие объёмы памяти раньше, поэтому вызов его для DOM-объектов, как только они больше не нужны, является хорошей практикой. Этот метод нужно вызывать только для объекта `Document`, но его можно вызывать и для дочерних узлов, чтобы удалить потомков этого узла.8384Можно избежать явного вызова этого метода, используя оператор [`with`](https://python-all.ru/3.8/reference/compound_stmts.html#with). Следующий код автоматически вызовет unlink для *dom* при выходе из блока `with`:8586```python87with xml.dom.minidom.parse(datasource) as dom:88    ... # Работать с DOM.89```9091#### `Node.writexml(writer, indent="", addindent="", newl="")`9293Записывает XML в объект writer. Writer принимает на вход тексты, а не байты; у него должен быть метод `write()`, соответствующий интерфейсу файлового объекта. Параметр *indent* задаёт отступ текущего узла. Параметр *addindent* задаёт дополнительный отступ для подузлов текущего узла. Параметр *newl* указывает строку, используемую для завершения строк.9495Для узла `Document` можно использовать дополнительный именованный аргумент *encoding* для указания поля кодировки в заголовке XML.9697Изменено в версии 3.8: Метод [`writexml()`](https://python-all.ru/3.8/library/xml.dom.minidom.html#xml.dom.minidom.Node.writexml) теперь сохраняет порядок атрибутов, заданный пользователем.9899#### `Node.toxml(encoding=None)`100101Возвращает строку или байтовую строку, содержащую XML, представленный узлом DOM.102103При явном указании аргумента *encoding* [1](https://python-all.ru/3.8/library/xml.dom.minidom.html#id3) результат представляет собой байтовую строку в указанной кодировке. Если аргумент *encoding* не указан, результатом является строка Unicode, и XML-объявление в результирующей строке не указывает кодировку. Кодирование этой строки в кодировку, отличную от UTF-8, скорее всего, некорректно, поскольку UTF-8 является кодировкой XML по умолчанию.104105Изменено в версии 3.8: Метод [`toxml()`](https://python-all.ru/3.8/library/xml.dom.minidom.html#xml.dom.minidom.Node.toxml) теперь сохраняет порядок атрибутов, заданный пользователем.106107#### `Node.toprettyxml(indent="\t", newl="\n", encoding=None)`108109Возвращает версию документа с красивым форматированием. *indent* задаёт строку отступа, по умолчанию – символ табуляции; *newl* задаёт строку, добавляемую в конце каждой строки, по умолчанию `\n`.110111Аргумент *encoding* ведёт себя как соответствующий аргумент [`toxml()`](https://python-all.ru/3.8/library/xml.dom.minidom.html#xml.dom.minidom.Node.toxml).112113Изменено в версии 3.8: Метод [`toprettyxml()`](https://python-all.ru/3.8/library/xml.dom.minidom.html#xml.dom.minidom.Node.toprettyxml) теперь сохраняет порядок атрибутов, заданный пользователем.114115## Пример 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## minidom и стандарт DOM187188Модуль [`xml.dom.minidom`](https://python-all.ru/3.8/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.8/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.8/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.8/library/xml.dom.minidom.html#module-xml.dom.minidom). Вместо этого [`xml.dom.minidom`](https://python-all.ru/3.8/library/xml.dom.minidom.html#module-xml.dom.minidom) использует стандартные исключения Python, такие как [`TypeError`](https://python-all.ru/3.8/library/exceptions.html#TypeError) и [`AttributeError`](https://python-all.ru/3.8/library/exceptions.html#AttributeError).199- Объекты `NodeList` реализованы с использованием встроенного типа list Python. Эти объекты предоставляют интерфейс, определённый в спецификации DOM, но в ранних версиях Python они не поддерживают официальный API. Однако они гораздо более «питоничны», чем интерфейс, определённый в рекомендациях W3C.200201Следующие интерфейсы не имеют реализации в [`xml.dom.minidom`](https://python-all.ru/3.8/library/xml.dom.minidom.html#module-xml.dom.minidom):202203- `DOMTimeStamp`204- `EntityReference`205206Большинство из них отражают информацию в XML-документе, которая не представляет общей ценности для большинства пользователей DOM.207208Сноски209210**[1](https://python-all.ru/3.8/library/xml.dom.minidom.html#id1)**211212Название кодировки в XML-выводе должно соответствовать соответствующим стандартам. Например, «UTF-8» допустимо, а «UTF8» недопустимо в объявлении XML-документа, хотя Python принимает её как название кодировки. См. [https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl](https://python-all.ru/3.8/library/xml.dom.minidom.html) и [https://www.iana.org/assignments/character-sets/character-sets.xhtml](https://python-all.ru/3.8/library/xml.dom.minidom.html).213