XML в Markdown: теги долой, иерархия остаётся
У XML есть привычка, которой нет ни у одного другого формата: он записывает имя каждого элемента дважды. Один раз — чтобы открыть, второй — чтобы закрыть. Добавьте префиксы пространств имён, атрибуты, отступы, делающие всё это читаемым, — и вы регулярно будете получать файл, в котором теги весят больше, чем содержимое, которое они оборачивают. Каталог товаров на 200 позиций может растянуться на тысячи строк и при этом содержать от силы полторы страницы реальной информации.
Конвертация XML в Markdown сохраняет дерево и убирает церемонии. Вложенность
элементов превращается в уровни заголовков, повторяющиеся соседние элементы — в списки или таблицы,
а угловые скобки исчезают. Загрузите файл .xml выше — и через несколько секунд получите
результат: бесплатно, без регистрации, потолок 50 МБ, ничего не сохраняется.
Во что превращается дерево элементов
Конвертер обходит документ и переводит каждую конструкцию:
- Элементы-контейнеры становятся заголовками. Элемент с дочерними элементами, но без собственного текста — это раздел. Его глубина в дереве задаёт уровень заголовка, так что корпоративная схема с пятью уровнями вложенности приходит в виде документа с правильной структурой разделов.
- Листовые элементы становятся подписанными значениями.
<author>Ursula Le Guin</author>читается как author: Ursula Le Guin. Одно имя вместо двух, и никаких скобок. - Повторяющиеся соседние элементы становятся списками или таблицами — об этом ниже, потому что именно здесь основная выгода.
- Смешанное содержимое сохраняется в строке. Это случай, когда текст и дочерние
элементы перемежаются, как в
<para>См. <ref>приложение</ref> для подробностей</para>. Наивные конвертеры разрывают это на фрагменты, и предложение теряется. Оно должно пройти одной читаемой строкой с сохранённой ссылкой. - Комментарии, инструкции обработки и XML-декларация удаляются. Ничто из этого не является содержимым.
Атрибуты: то, что теряют, не замечая
XML хранит данные в двух местах — между тегами и внутри них. Текст элементов очевиден. Атрибуты
легко упустить, и многие наивные извлекатели молча их выбрасывают. Это нормально, когда атрибуты —
метаданные вроде id="4471". И это катастрофа, когда они — полезная нагрузка.
А это встречается часто. <price currency="GBP">49.99</price> без валюты
бессмысленно. Форматы конфигурации ещё хуже — Maven, Ant, Spring, манифесты Android и файлы
app.config из .NET часто кладут в атрибуты почти всё, так что извлечение только текста
элементов из такого файла возвращает документ, структурно корректный и почти полностью пустой. Если
вы конвертировали конфигурационный файл и вывод выглядит подозрительно коротким — причина в этом.
В Markdown-выводе атрибуты должны стоять рядом с элементом, к которому относятся, а не исчезать — как короткое уточнение рядом со значением или как дополнительные колонки, когда элемент входит в повторяющийся набор. Сверьте первый экран вывода с исходником, прежде чем доверять ему что-то важное. Десять секунд беглого просмотра лучше, чем сбитый с толку разговор с моделью потом.
Повторяющиеся элементы становятся таблицами
Лучшая для XML форма — родитель со множеством одинаковых детей: элементы <item>
в RSS-ленте, <row> в выгрузке из базы данных, записи
<employee> в HR-дампе. У каждого ребёнка одни и те же вложенные элементы в одном
и том же порядке.
Всё это схлопывается в одну Markdown-таблицу. Имена вложенных элементов становятся заголовками колонок, каждая запись — строкой, а повторение тегов — которое в сыром файле означало запись каждого имени поля дважды на каждую запись — происходит ровно один раз, в шапке. Это самое большое разовое сокращение, какое даёт любая конвертация XML, и это причина выбрать Markdown, а не плоский текст, для всего, что имеет форму записей.
Схема деградирует, когда записи неровные — необязательные элементы есть у одних детей и отсутствуют у других, или один ребёнок содержит вложенный блок, которого нет у остальных. Вы получите пропуски или вложенную часть, вытолкнутую под таблицу. Если данные по-настоящему прямоугольные, экспорт в CSV и конвертер CSV в Markdown дадут более чистые таблицы. А если источник имеет форму JSON, а не тегов, конвертер JSON в Markdown решает ту же задачу с другой стороны.
Пространства имён, конверты и корпоративный шум
Реальный XML редко бывает чистым. Три вещи раздувают его сверх информационного содержания:
- Пространства имён. Декларации
xmlnsи префиксы вродеsoap:,xsi:,atom:илиdc:существуют, чтобы предотвратить коллизии имён между словарями. Читателю они не говорят ничего. При конвертации префиксы отбрасываются, так что<dc:creator>читается как creator. Единственный случай, когда об этом стоит думать, — когда два пространства имён действительно используют одно локальное имя для разных вещей; редкость, но проверьте, если вы объединяете словари. - SOAP-конверты. Ответ веб-сервиса заворачивает нужную вам часть в
EnvelopeиBody, зачастую плюс заголовки, набитые токенами безопасности и данными маршрутизации. После конвертации вы получаете документ, где полезная нагрузка наконец видна, а не закопана на четыре уровня внутрь шаблонного кода, который приходится мысленно пролистывать. - Ссылки на схемы.
xsi:schemaLocation, декларации DTD и атрибуты валидации описывают, как файл нужно проверять, а не что в нём сказано. Для любых задач на этой странице — шум.
RSS- и Atom-ленты находятся на дружелюбном конце спектра. Они однородны, неглубоки и конвертируются в чистый список датированных записей — разумный способ отдать модели месяц постов из блога. Учтите, что описания в лентах обычно содержат HTML, экранированный внутри XML, — он придёт в ваш вывод как разметка; прогоните его через конвертер HTML в Markdown, если нужен чистый результат, или используйте Web2Txt, чтобы забрать страницы как следует.
Когда стоит оставить сырой XML
Прямой ответ, поскольку большинство страниц, продающих конвертеры, его не дают: модели читают XML нормально. Он многословен, но однозначен и очень хорошо представлен в обучающих данных. Конвертация — это выбор, а не требование.
Оставьте как есть, когда вы просите XPath-выражения, XSLT-таблицу стилей, парсер или схему — всё, где модель должна воспроизводить точные имена элементов, префиксы пространств имён и различие между атрибутом и элементом. Markdown намеренно сглаживает ровно эти детали. Вместо этого вставьте показательный фрагмент настоящего файла.
Конвертируйте, когда документ должен прочитать человек, когда нужно быстро понять незнакомую схему или когда сырой файл состоит в основном из тегов, а контекста не хватает. Это реальные выигрыши. Всё остальное — дело вкуса.
XML, о котором вы не знали, что это XML
Немало форматов, которые вы считаете бинарными, внутри — XML в ZIP-архиве. Переименуйте
.docx в .zip, распакуйте — и найдёте document.xml плюс кучу
файлов связей. С EPUB та же история: XHTML-документы содержимого и XML-манифест пакета в архиве.
То же самое с .pptx и с .xlsx.
Можно распаковать такой файл и конвертировать XML вручную. Не надо — внутренняя разметка полна стилевых прогонов, отслеживания правок и инструкций вёрстки, в которых тонет текст. Используйте Word в Markdown или EPUB в Markdown — они знают, какие части этого XML являются содержимым, а какие — инструкциями форматирования. Эта страница для XML, который вам отдали именно как XML: ленты, выгрузки, ответы API, конфигурация, обмен данными.
Часто задаваемые вопросы
Как конвертировать XML в Markdown?
Загрузите .xml выше — и структура документа отобразится на Markdown: иерархия элементов станет уровнями заголовков, повторяющиеся соседние элементы — списками или таблицами. Бесплатно, до 50 МБ на файл, без регистрации. Форма документа сохраняется — в этом отличие от уплощения в текст.
Иерархия элементов превращается в уровни заголовков?
Да, отображение именно такое — вложенный элемент становится заголовком более глубокого уровня. Это хорошо работает для XML документной формы вроде DocBook, TEI или экспорта статей, где вложенность действительно отражает разделы внутри разделов. И плохо — для XML с данными, где вложенность отражает схему базы, и вы получаете двенадцать уровней заголовков, описывающих одну запись.
Что происходит с префиксами пространств имён?
Они отбрасываются. Заголовок вида dc:title или tei:head человеку не говорит ничего, а модели — ещё меньше, поэтому префиксы снимаются и используется локальное имя элемента. Если два пространства имён в одном документе определяют одинаковое локальное имя, они сольются — редкость, но стоит взглянуть, если заголовки кажутся продублированными.
Годится ли это для конвертации DocBook или DITA?
Для первого прохода — да. Проза, разделы, списки и строчные выделения переносятся хорошо, потому что эти форматы размечают их явно. Условная профилизация, ссылки на содержимое, включения сущностей и разрешение перекрёстных ссылок не выживают — а это ровно те части, ради которых формат и использовали, и никакой универсальный конвертер их не разрешит.
Что выбрать для большого XML-корпуса?
В большинстве случаев — текст. Если вы строите эмбеддинги по тысячам записей, синтаксис заголовков — накладные расходы, повторяющиеся в каждом чанке без всякой пользы для поиска. Markdown оправдан, когда человек или модель будут читать один документ и им нужно понимать, где какие разделы.
Вариант с плоским текстом и остальные инструменты
Если структура не нужна вовсе — текст для эмбеддингов, поисковый индекс или минимально возможное число токенов — используйте XML в обычный текст: он достаёт содержимое из-под тегов и не оставляет ничего лишнего. Переключатель формата в верхней части страницы переводит между двумя режимами и не сбрасывает загруженный файл, так что сравнить оба вывода — один клик. Счётчик токенов под результатом показывает, во сколько обходится каждый.
Если XML — один файл в проекте: конфигурация, дескриптор сборки, фикстура — конвертация его в одиночку даёт модели данные без окружающего кода. Конвертер репозитория GitHub в текст и конвертер локального каталога позволяют взять XML и код, который его использует, вместе — обычно это более полезная единица. File2Txt обрабатывает все поддерживаемые форматы в одном месте, а руководство по подготовке файлов для LLM излагает общие принципы.
Repo2Txt создаёт и поддерживает v12hero — независимый разработчик, который делает нативные и веб-приложения с приоритетом приватности.