xml.dom.minidom — Минимальная реализация DOM
Исходный код: Lib/xml/dom/minidom.py
xml.dom.minidom — это минимальная реализация интерфейса объектной модели документа, API которой похож на API в других языках. Она задумана как более простая и значительно компактная альтернатива полной DOM. Пользователям, которые ещё не знакомы с DOM, для обработки XML рекомендуется использовать модуль xml.etree.ElementTree.
Примечание
Если вам нужно проанализировать недоверенные или неаутентифицированные данные, см. раздел Безопасность XML.
Приложения DOM обычно начинают с разбора XML в DOM. В модуле xml.dom.minidom для этого используются функции разбора:
from xml.dom.minidom import parse, parseString
dom1 = parse('c:\\temp\\mydata.xml') # parse an XML file by name
datasource = open('c:\\temp\\mydata.xml')
dom2 = parse(datasource) # parse an open file
dom3 = parseString('<myxml>Some data<empty/> some more data</myxml>')
Функция parse() может принимать имя файла или открытый файловый объект.
-
xml.dom.minidom.parse(filename_or_file, parser=None, bufsize=None) -
Возвращает
Documentиз заданных входных данных. Аргумент filename_or_file может быть именем файла или файловоподобным объектом. Если указан аргумент parser, он должен быть объектом парсера SAX2. Эта функция изменит обработчик документа парсера и включит поддержку пространств имён; остальные параметры парсера (например, настройка обработчика сущностей) необходимо задать заранее.
Если XML представлен строкой, можно вместо этого использовать функцию parseString():
-
xml.dom.minidom.parseString(string, parser=None) -
Возвращает
Document, представляющий строку. Этот метод создаёт для строки объектio.StringIOи передаёт его вparse().
Обе функции возвращают объект Document, представляющий содержимое документа.
Функции parse() и parseString() связывают XML-парсер с «построителем DOM», который принимает события разбора от любого парсера SAX и преобразует их в дерево DOM. Названия этих функций, возможно, вводят в заблуждение, но при знакомстве с интерфейсами их легко понять. Разбор документа завершается до возврата из этих функций; просто сами функции не предоставляют реализацию парсера.
Можно также создать Document, вызвав метод объекта «реализации DOM». Получить этот объект можно, вызвав функцию getDOMImplementation() из пакета xml.dom или модуля xml.dom.minidom. Получив Document, можно добавить в него дочерние узлы, чтобы заполнить DOM:
from xml.dom.minidom import getDOMImplementation
impl = getDOMImplementation()
newdoc = impl.createDocument(None, "some_tag", None)
top_element = newdoc.documentElement
text = newdoc.createTextNode('Some textual content.')
top_element.appendChild(text)
Получив объект документа DOM, можно обращаться к частям XML-документа через его свойства и методы. Эти свойства определены в спецификации DOM. Основное свойство объекта документа — свойство documentElement. Оно предоставляет главный элемент XML-документа — тот, который содержит все остальные. Пример программы:
dom3 = parseString("<myxml>Some data</myxml>")
assert dom3.documentElement.tagName == "myxml"
Закончив работу с деревом DOM, можно при желании вызвать метод unlink(), чтобы ускорить очистку уже ненужных объектов. unlink() — расширение API DOM, специфичное для xml.dom.minidom; оно делает узел и его потомков по сути непригодными к использованию. В противном случае сборщик мусора Python со временем освободит объекты дерева.
См. также
- Спецификация объектной модели документа (DOM) уровня 1
-
Рекомендация W3C для DOM, поддерживаемой
xml.dom.minidom.
Объекты DOM
Определение API DOM для Python приведено в документации модуля xml.dom. В этом разделе перечислены различия между этим API и xml.dom.minidom.
-
Node.unlink() -
Разрывает внутренние ссылки в DOM, чтобы сборщик мусора мог освободить память в версиях Python без циклического сборщика мусора. Даже при наличии циклического сборщика мусора этот метод позволяет раньше освободить значительный объём памяти, поэтому рекомендуется вызывать его для объектов DOM сразу после того, как они перестают быть нужны. Достаточно вызвать его для объекта
Document, но его также можно вызывать для дочерних узлов, чтобы удалить потомков этого узла.Можно не вызывать этот метод явно, используя инструкцию
with. Следующий код автоматически удалит связи DOM dom при выходе из блокаwith:with xml.dom.minidom.parse(datasource) as dom: ... # Work with dom.
-
Node.writexml(writer, indent='', addindent='', newl='', encoding=None, standalone=None) -
Записывает XML в объект записи. Объект записи принимает на вход текст, но не байты; у него должен быть метод
write(), соответствующий методу файлового объекта. Параметр indent задаёт отступ текущего узла. Параметр addindent задаёт величину дополнительного отступа для дочерних узлов текущего узла. Параметр newl задаёт строку, используемую для завершения строк.Для узла
Documentможно указать дополнительный именованный аргумент encoding, чтобы задать поле кодировки в заголовке XML.Аналогично, явная передача аргумента standalone приводит к добавлению объявления standalone в пролог XML-документа. Если значение равно
True, добавляетсяstandalone="yes", иначе добавляется"no". Если аргумент не указан, объявление в документ не добавляется.Изменено в версии 3.8: Теперь метод
writexml()сохраняет порядок атрибутов, заданный пользователем.Изменено в версии 3.9: Добавлен параметр standalone.
-
Node.toxml(encoding=None, standalone=None) -
Возвращает строку или байтовую строку, содержащую XML, представленный узлом DOM.
Если явно указан аргумент encoding [1], результатом будет байтовая строка в заданной кодировке. Если аргумент encoding не указан, результатом будет строка Unicode, а объявление XML в ней не будет содержать кодировку. Кодирование этой строки в кодировке, отличной от UTF-8, скорее всего, будет неправильным, поскольку кодировка XML по умолчанию — UTF-8.
Аргумент standalone работает точно так же, как в методе
writexml().Изменено в версии 3.8: Теперь метод
toxml()сохраняет порядок атрибутов, заданный пользователем.Изменено в версии 3.9: Добавлен параметр standalone.
-
Node.toprettyxml(indent='\t', newl='\n', encoding=None, standalone=None) -
Возвращает документ в отформатированном виде. Параметр indent задаёт строку отступа; по умолчанию используется символ табуляции. Параметр newl задаёт строку, добавляемую в конце каждой строки; по умолчанию используется
\n.Аргумент encoding работает так же, как соответствующий аргумент метода
toxml().Аргумент standalone работает точно так же, как в методе
writexml().Изменено в версии 3.8: Теперь метод
toprettyxml()сохраняет порядок атрибутов, заданный пользователем.Изменено в версии 3.9: Добавлен параметр standalone.
Пример DOM
Эта программа представляет собой достаточно реалистичный пример простой программы. В данном случае мы не слишком используем гибкость DOM.
import xml.dom.minidom
document = """\
<slideshow>
<title>Demo slideshow</title>
<slide><title>Slide title</title>
<point>This is a demo</point>
<point>Of a program for processing slides</point>
</slide>
<slide><title>Another demo slide</title>
<point>It is important</point>
<point>To have more than</point>
<point>one slide</point>
</slide>
</slideshow>
"""
dom = xml.dom.minidom.parseString(document)
def getText(nodelist):
rc = []
for node in nodelist:
if node.nodeType == node.TEXT_NODE:
rc.append(node.data)
return ''.join(rc)
def handleSlideshow(slideshow):
print("<html>")
handleSlideshowTitle(slideshow.getElementsByTagName("title")[0])
slides = slideshow.getElementsByTagName("slide")
handleToc(slides)
handleSlides(slides)
print("</html>")
def handleSlides(slides):
for slide in slides:
handleSlide(slide)
def handleSlide(slide):
handleSlideTitle(slide.getElementsByTagName("title")[0])
handlePoints(slide.getElementsByTagName("point"))
def handleSlideshowTitle(title):
print(f"<title>{getText(title.childNodes)}</title>")
def handleSlideTitle(title):
print(f"<h2>{getText(title.childNodes)}</h2>")
def handlePoints(points):
print("<ul>")
for point in points:
handlePoint(point)
print("</ul>")
def handlePoint(point):
print(f"<li>{getText(point.childNodes)}</li>")
def handleToc(slides):
for slide in slides:
title = slide.getElementsByTagName("title")[0]
print(f"<p>{getText(title.childNodes)}</p>")
handleSlideshow(dom)
minidom и стандарт DOM
Модуль xml.dom.minidom по сути представляет собой DOM, совместимую с DOM 1.0 и поддерживающую некоторые возможности DOM 2 (в первую очередь возможности работы с пространствами имён).
Использовать интерфейс DOM в Python просто. Применяются следующие правила соответствия:
- Доступ к интерфейсам осуществляется через объекты экземпляров. Приложениям не следует создавать экземпляры классов самостоятельно; вместо этого нужно использовать функции создания, доступные в объекте
Document. Производные интерфейсы поддерживают все операции (и атрибуты) базовых интерфейсов, а также любые новые операции. - Операции используются как методы. Поскольку DOM использует только параметры
in, аргументы передаются в обычном порядке (слева направо). Необязательных аргументов нет. ОперацииvoidвозвращаютNone. - Атрибуты IDL соответствуют атрибутам экземпляров. Для совместимости с языковым соответствием OMG IDL для Python к атрибуту
fooтакже можно обращаться через методы доступа_get_foo()и_set_foo(). Атрибутыreadonlyнельзя изменять; это ограничение не проверяется во время выполнения. - Типы
short int,unsigned int,unsigned long longиbooleanсоответствуют целочисленным объектам Python. - Тип
DOMStringсоответствует строкам Python.xml.dom.minidomподдерживает байты и строки, но обычно возвращает строки. Значения типаDOMStringтакже могут бытьNone, если спецификация DOM W3C допускает для них значение IDLnull. -
Объявления
constсоответствуют переменным в их области видимости (например,xml.dom.minidom.Node.PROCESSING_INSTRUCTION_NODE); их нельзя изменять. -
DOMExceptionв настоящее время не поддерживается вxml.dom.minidom. Вместо этогоxml.dom.minidomиспользует стандартные исключения Python, такие какTypeErrorиAttributeError. -
Объекты
NodeListреализованы с помощью встроенного типа list в Python. Эти объекты предоставляют интерфейс, определённый спецификацией DOM, однако в ранних версиях Python они не поддерживают официальный API. При этом они гораздо более «питоничны», чем интерфейс, определённый рекомендациями W3C.
Следующие интерфейсы не реализованы в xml.dom.minidom:
DOMTimeStampEntityReference
Большинство из них предназначены для доступа к сведениям XML-документа, которые не представляют общего интереса для большинства пользователей DOM.
Сноски
© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/xml.dom.minidom.html