XML: Формат и парсинг
XML — обзор
XML (eXtensible Markup Language) — текстовый формат разметки данных, стандартизированный W3C в 1998. XML был доминирующим форматом обмена данными в 2000-х: SOAP web-сервисы, конфигурации (Maven, Ant, Spring), документы (OOXML, ODF), синдикация (RSS, Atom). Сейчас во многих областях заменён JSON, но продолжает использоваться в корпоративных системах.
Ключевое отличие XML от JSON: расширяемость через namespace’ы и схемы. XML позволяет определять собственные теги, комбинировать словари (namespaces), и валидировать структуру через XSD. Цена — многословность и сложность парсинга.
Структура XML документа
XML-документ состоит из элементов (tags), атрибутов, текстового содержимого, и необязательных деклараций:
Encoding overhead: теги × 2
XML самый многословный из текстовых форматов — каждый элемент дублирует имя тега (открывающий + закрывающий):
XML-запись в 9 раз больше Avro для тех же данных. При миллионах записей разница измеряется гигабайтами.
Namespace’ы: комбинирование словарей
Namespace’ы позволяют использовать элементы из разных XML-словарей в одном документе без конфликтов имён:
Namespace URI — не URL. http://www.w3.org/1999/xhtml — это идентификатор, а не адрес. Парсер не загружает эту страницу. Но по конвенции URI часто является URL, указывающим на документацию namespace.
XSD: валидация структуры
XML Schema Definition (XSD) — язык описания структуры XML-документов. Более мощный, чем DTD: поддерживает типы данных, ограничения, наследование:
SAX vs DOM: модели парсинга
XML имеет две принципиально разные модели парсинга:
Существует третий подход — StAX (Streaming API for XML): pull-based парсер. В отличие от SAX (push: парсер вызывает callbacks), StAX (pull: приложение запрашивает следующий event). StAX проще для сложной логики обработки, потому что контроль потока у приложения, а не у парсера.
XSLT: трансформации XML
XSLT (eXtensible Stylesheet Language Transformations) — язык для преобразования XML-документов в другие форматы (XML, HTML, текст). XSLT сам написан на XML:
Почему XML жив: SOAP, config, документы
Несмотря на доминирование JSON для API, XML остаётся стандартом в нескольких нишах:
XML в data pipelines
XML в data engineering — обычно входной формат из legacy-систем, который нужно конвертировать:
Spark XML reader (spark-xml library) загружает XML через com.databricks.spark.xml. Ключевая проблема: XML не splittable по byte offset (вложенность + namespace’ы). Spark читает каждый XML-файл одним executor’ом. Для параллелизма: разбейте XML на много маленьких файлов перед ingestion.
Итог
XML — мощный, но тяжёлый формат. Его преимущества (namespace’ы, XSD-валидация, XSLT-трансформации, mixed content) востребованы в документах, конфигурациях и enterprise-интеграциях. Для data engineering XML — обычно legacy-источник, требующий конверсии в columnar формат. Overhead XML (теги × 2, атрибуты, пробелы) делает его самым неэффективным форматом хранения данных.