XML — формат для обмена данными между приложениями, который используется в API, конфигурациях и документах. Чтобы автоматизировать работу с такими файлами — извлекать нужную информацию, преобразовывать структуру или проверять корректность — нужны XML-парсеры.
В статье разбираемся, как работают XML-парсеры, какие методы парсинга существуют, как использовать lxml и BeautifulSoup, и как обезопасить приложение при работе с XML.

XML-парсеры: что это, методы парсинга и лучшие инструменты для работы с XML

15 апреля 2025
20 минут
эксперт в информационной безопасности в Start X
Андрей Жаркевич
автор, дипломированный айтишник, люблю объяснять сложное простыми словами
Никита Барышников
автор, дипломиро­ванный айтишник, люблю объяснять сложное простыми словами
Никита Барышников
эксперт в информационной безопасности в Start X
Андрей Жаркевич

Что такое XML-парсеры и зачем они нужны

Сайты, приложения и устройства постоянно обмениваются различными данными, например, прогнозами погоды, обновлениями цен или настройками приложений. Чаще всего эти данные передаются в формате XML.

XML (расширяемый язык разметки) — универсальный формат для хранения и обмена данными. Его структура основана на четкой иерархии тегов, что делает формат как машинно-читаемым, так и удобным для восприятия человеком.

Вот простой пример XML-документа:
<weather>
  <city name="Москва">
    <temperature unit="Celsius">-5</temperature>
    <condition>Ясно</condition>
  </city>
</weather>
Из такого файла легко понять, что сейчас в Москве -5 °C и ясная погода. Но что, если вам нужно обработать эти данные программно и использовать их в приложении? В этом поможет XML-парсер.

XML-парсер преобразует текст в структуру данных, с которой удобно работать. Это позволяет:

  • Извлекать нужные данные. Например, найти название книги или ее цену.
  • Проверять корректность структуры. Парсер укажет на ошибку, если не закрыт тег или нарушен порядок вложенности.
  • Преобразовывать XML в данные нужного формата. Например, в список Python или объект JavaScript.

Вот где чаще всего нужен XML-парсер:

  • API, веб-сервисы и сайты. Многие сервисы до сих пор передают данные в XML-формате. Чтобы извлечь нужную информацию, используется парсер.
  • Конфигурационные файлы. XML-файлы часто применяются для хранения настроек приложений. Их автоматическая обработка экономит время и снижает количество ошибок.
  • Работа с документами. Например, форматы Microsoft Office или SVG основаны на XML. Парсеры позволяют работать с такими файлами на уровне структуры и содержимого.

Благодаря парсерам данные из XML становятся доступными для анализа, обработки и встраивания в приложения.
Скачайте карту знаний и навыков по безопасной разработке
В ней — 13 уязвимостей и технологий, которые нужно знать разработчику, чтобы писать безопасный код

Методы парсинга XML

Работа с XML может быть организована разными способами, и выбор метода парсинга зависит от ваших потребностей: объема данных, доступной памяти и задач. У каждого метода свои особенности, преимущества и области применения. Рассмотрим их подробнее.
Парсинг на основе дерева (Tree-based parsing)
Метод дерева предполагает, что весь XML-файл загружается в оперативную память и преобразуется в иерархическую структуру — дерево.

Каждый элемент становится «узлом», а дочерние элементы — «ветвями». Это удобно для работы с небольшими документами, где нужно быстро получить доступ к любым участкам данных.

Код ниже демонстрирует, как с помощью библиотеки ElementTree можно построить дерево XML-документа, а затем получить доступ к отдельным элементам, что парсить названия всех книг:
import xml.etree.ElementTree as ET

xml_data = """<library>
                <book><title>Book 1</title></book>
                <book><title>Book 2</title></book>
              </library>"""

root = ET.fromstring(xml_data)
for book in root.findall('book'):
    print(book.find('title').text)
# Вывод: Book 1, Book 2
Событийный парсинг (Event-based parsing)
Событийный подход к парсингу работает иначе. XML-файл читается постепенно, как поток, и на каждом этапе генерируются события, такие как «начало тега», «текст внутри тега» или «конец тега». Программист сам решает, как реагировать на эти события в зависимости от задач.

Ниже — пример того, как обрабатывать XML-файл с логами. Мы реагируем на события «начало элемента» и «текст внутри элемента», чтобы напечатать ID и сообщение каждого лога:
import xml.sax

class LogHandler(xml.sax.ContentHandler):
    def startElement(self, name, attrs):
        if name == "log":  # Если найден элемент <log>, выводим его атрибуты
            print("Найден лог-файл:", attrs["id"])
    def characters(self, content):
        if content.strip():
            print("Сообщение лога:", content.strip())  # Выводим текст внутри элемента

xml_data = """<logs>
                <log id="101">Ошибка соединения</log>
                <log id="102">Успешный вход в систему</log>
              </logs>"""

parser = xml.sax.make_parser()
parser.setContentHandler(LogHandler())
parser.parseString(xml_data)  # Парсим XML как поток
Потоковая обработка (Streaming parsing)
Этот метод — продолжение событийного, но с упором на потоковую обработку. Вместо создания дерева вы извлекаете данные по мере их поступления. Пример — библиотека lxml с функцией iterparse.

Код ниже демонстрирует, как с помощью lxml читать потоковый XML-документ и извлекать только элементы <order>, такие как ID заказа:
from lxml import etree

xml_data = """<orders>
                <order><id>1</id><value>100</value></order>
                <order><id>2</id><value>200</value></order>
              </orders>"""

for event, element in etree.iterparse(xml_data):  # Читаем элементы по одному
    if element.tag == "order":  # Только <order>
        print(f"Найден заказ: {element.find('id').text}")
DOM-парсинг (Document Object Model)
Метод DOM похож на структуру дерева, где каждый элемент XML-документа представлен объектом. Эти объекты можно обрабатывать с помощью API DOM, который соответствует международным стандартам.

Код ниже демонстрирует, как использовать библиотеку minidom, чтобы читать XML-документ. Мы извлекаем названия книг из объектов DOM:
from xml.dom.minidom import parseString

xml_data = """<books>
                <book><title>Book A</title></book>
                <book><title>Book B</title></book>
              </books>"""

dom = parseString(xml_data)  # Строим DOM-модель
for book in dom.getElementsByTagName("book"):
    print(book.getElementsByTagName("title")[0].firstChild.nodeValue)
Какой метод выбрать
Выбор метода парсинга XML зависит от ваших задач:

  • Деревья — подходят для небольших файлов, которые часто изменяются.
  • Событийный парсинг — эффективен для работы с большими файлами и потоковой обработкой данных.
  • Потоковая обработка — идеален для извлечения только необходимых данных из больших XML-документов.
  • DOM — лучший выбор для работы с документами, где важны строгие стандарты и полноценная структура.
Каждый метод имеет свои преимущества и ограничения, выбор зависит от объема данных, скорости обработки и специфики задач.

Телеграм-канал Start X

Подписаться
Наши разборы мошеннических схем поймет даже бабушка

Инструменты для работы с XML: lxml и BeautifulSoup

Работа с XML-файлами может быть сложной, особенно для начинающих. Однако в Python есть мощные инструменты для их обработки, такие как lxml и BeautifulSoup с поддержкой lxml.

lxml — самостоятельная библиотека для парсинга и обработки XML и HTML, которая написана на C с Python-интерфейсом.

BeautifulSoup — удобная библиотека для парсинга, но для работы с XML она требует установленного lxml как основной библиотеки для парсинга XML. Без lxml BeautifulSoup может работать только с HTML.
lxml
lxml представляет собой полный набор инструментов для парсинга, создания, изменения и извлечения данных из XML.

  • Высокая производительность благодаря реализации на C.
  • Полная поддержка XPath для сложных запросов к XML-структуре.
  • Валидация по XML Schema, RelaxNG и DTD.
  • Поддержка XSLT-преобразований.
  • Работа с пространствами имен XML.
  • Возможность потоковой обработки больших файлов.
lxml можно использовать самостоятельно для всех задач, связанных с XML, без необходимости в дополнительных библиотеках.

Представьте, что вам нужно разобраться в каталоге товаров, найти названия, цены и категории. Вот как это сделать с помощью lxml:
from lxml import etree

xml_data = """<catalog>
    <product>
        <name>Ноутбук</name>
        <price>1200</price>
        <category>Электроника</category>
    </product>
    <product>
        <name>Смартфон</name>
        <price>700</price>
        <category>Электроника</category>
    </product>
    <product>
        <name>Офисный стул</name>
        <price>150</price>
        <category>Мебель</category>
    </product>
</catalog>"""

root = etree.fromstring(xml_data)  # Загружаем XML-дерево
products = root.xpath('//product')  # Находим все <product> с помощью XPath

for product in products:
    name = product.find('name').text  # Забираем название
    price = product.find('price').text  # И цену
    category = product.find('category').text  # И категорию
    print(f"Товар: {name}, Цена: {price}, Категория: {category}")
А вот что будет на выходе:
Товар: Ноутбук, Цена: 1200, Категория: Электроника
Товар: Смартфон, Цена: 700, Категория: Электроника
Товар: Офисный стул, Цена: 150, Категория: Мебель
lxml подходит тем, кто работает с большими XML-файлами или хочет использовать продвинутые инструменты вроде XPath.
BeautifulSoup
BeautifulSoup — библиотека, которая представляет собой удобный интерфейс для извлечения данных из HTML и XML. Она не является парсером сама по себе, а для работы с XML требует установленного lxml, который используется как основной механизм парсинга.

Допустим, у вас есть XML с описанием книг в интернет-магазине, и вы решили вытащить из него информацию о каждой книге. Вот как это делается с BeautifulSoup:
from bs4 import BeautifulSoup

xml_data = """<bookstore>
    <book id="1" available="true">
        <title>Python для профессионалов</title>
        <author>Джон Смит</author>
        <price>1250</price>
        <category>Программирование</category>
    </book>
    <book id="2" available="false">
        <title>Искусственный интеллект</title>
        <author>Анна Джонсон</author>
        <price>950</price>
        <category>Наука</category>
    </book>
    <book id="3" available="true">
        <title>Большие данные</title>
        <author>Майкл Браун</author>
        <price>1100</price>
        <category>Программирование</category>
    </book>
</bookstore>"""

# Обратите внимание на параметр 'xml' - он указывает BeautifulSoup 
# использовать lxml в качестве XML-парсера
soup = BeautifulSoup(xml_data, 'xml')  

# Найдем все книги в магазине
books = soup.find_all('book')
for book in books:
    title = book.title.text
    author = book.author.text
    price = book.price.text
    category = book.category.text
    available = "В наличии" if book['available'] == "true" else "Нет в наличии"
    
    print(f"Книга: {title}")
    print(f"Автор: {author}")
    print(f"Цена: {price} руб.")
    print(f"Категория: {category}")
    print(f"Статус: {available}")
    print("-" * 40)
И вот что мы получим:
Книга: Python для профессионалов
Автор: Джон Смит
Цена: 1250 руб.
Категория: Программирование
Статус: В наличии

Книга: Искусственный интеллект
Автор: Анна Джонсон
Цена: 950 руб.
Категория: Наука
Статус: Нет в наличии

Книга: Большие данные
Автор: Майкл Браун
Цена: 1100 руб.
Категория: Программирование
Статус: В наличии
BeautifulSoup с lxml может быть полезен, когда вам нужен простой и интуитивно понятный API для работы с XML. Однако за кулисами всю работу по парсингу XML выполняет именно lxml.
BeautifulSoup и lxml: что выбрать
Оба инструмента не конкурируют, а дополняют друг друга.

lxml — самостоятельная библиотека для работы с XML, которая предоставляет все необходимые функции для парсинга и обработки. В то время как BeautifulSoup использует lxml в качестве основного механизма парсинга XML и предоставляет более удобный и простой интерфейс для работы с документами.

В чем опасность XML-парсеров и как защитить приложение

XML-парсеры — удобные инструменты для обработки данных из XML-документов, но при неправильной настройке они могут представлять угрозу безопасности.

Одна из таких угроз — XXE-атака, о которой мы рассказывали в одной из прошлых статей. В такой атаке злоумышленник может использовать уязвимости парсера, чтобы получить доступ к конфиденциальным файлам, отправить запросы к внутренним сервисам или даже выполнить удаленный код.

  • Отключите поддержку внешних сущностей. Многие современные парсеры позволяют отключить обработку внешних сущностей, что значительно снижает риск XXE-атак.
  • Используйте безопасные настройки парсера. Убедитесь, что парсер настроен на работу в безопасном режиме, с ограничением доступа к файлам и внешним ресурсам.
  • Валидируйте и фильтруйте входные данные. Всегда проверяйте и фильтруйте данные, прежде чем передавать их в парсер, чтобы исключить возможность внедрения вредоносного кода.
  • Обновляйте парсеры. Используйте актуальные версии библиотек и парсеров, так как старые версии могут содержать известные уязвимости.

На платформе Start EDU мы рассказываем про уязвимости XML-парсеров во всех популярных языках программирования — от Python и Java до PHP и SQL, а также показываем, как правильно настроить защиту в каждом конкретном случае. Запишитесь на бесплатное демо, чтобы узнать, как защитить ваши приложения от XXE-атак и других угроз, связанных с XML-парсерами.

Что еще почитать

Мужчина в кресле с ноутбуком

Подпишитесь на дайджест Start X

Еженедельная подборка материалов и аналитики про цифровые атаки на людей, технологии защиты, безопасность инфраструктуры и приложений
Нажимая кнопку «Отправить заявку» вы соглашаетесь с политикой обработки персональных данных.