Перейти к содержимому

Проверить XML

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

  • Не сохраняется
  • Без очереди и ожидания
  • Без регистрации и водяных знаков
Отформатировано

Вставьте XML — он проверяется по мере ввода.

Как это работает

1

Вставьте XML

Или перетащите файл. Никуда ничего не отправляется.

2

Посмотрите результат

Синтаксис корректен — и краткая сводка содержимого. Или точная строка и столбец первой ошибки.

3

Исправьте и проверьте снова

Правьте прямо на месте — результат обновляется по мере ввода.

Две разные планки — и какая из них проверяется здесь

В XML есть два уровня корректности, и их постоянно путают. Синтаксически корректный (well-formed) документ соблюдает правила самого XML: один корневой элемент, все теги закрыты, вложенность правильная, символы допустимы, амперсанды и угловые скобки экранированы, значения атрибутов в кавычках, имена атрибутов внутри элемента не повторяются. Валидный (valid) — это более сильное требование: документ ещё и соответствует конкретной схеме, где нужные элементы стоят в нужном порядке и содержат значения нужного типа. Эта страница проверяет первое. Любой XML-парсер отвергает документ, который не проходит эту проверку, поэтому именно она решает, можно ли вообще прочитать файл.

Ошибки предсказуемы. С большим отрывом чаще всего встречается неэкранированный & — с него начинается ссылка на сущность, поэтому URL с параметрами, вставленный прямо в элемент, ломает документ. Одиночный < в тексте делает то же самое. Дальше идут несовпадающие или незакрытые теги, элементы, закрытые в неправильном порядке, два корневых элемента и случайный управляющий символ, который XML не допускает вовсе, хотя в файле его не видно.

DTD или схема намеренно никогда не загружаются, и это свойство безопасности, а не недостающая функция. XML-документ может ссылаться на внешнюю сущность, и парсер, который её разрешает, пойдёт и загрузит то, на что она указывает, — файл на диске, адрес во внутренней сети. Это уязвимость XML External Entity (XXE), один из самых эксплуатируемых классов ошибок, и единственная полная защита — не разрешать такие сущности. Поэтому страница никуда не обращается, а платой за это становится то, что проверка по схеме в неё не входит.

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

Если нужно другое

Для проверки по схеме эталонный инструмент — xmllint: xmllint --noout --schema schema.xsd file.xml для XSD, --relaxng для RELAX NG и --noout --valid для DTD. Он сообщает обо всех нарушениях, а не останавливается на первом, — именно это нужно, когда документ действительно неверен, а не просто повреждён.

Если на вход поступают недоверенные данные, настройки парсера важнее валидатора. Явно отключите разрешение внешних сущностей и обработку DTD в своём языке — defusedxml в Python, LIBXML_NONET в PHP, безопасная обработка (secure processing) в Java, — потому что несколько популярных парсеров до сих пор разрешают сущности по умолчанию, а уязвимость живёт именно в настройках по умолчанию.

Частые вопросы

Мой XML где-нибудь сохраняется?

Нет. Запросов к серверу и журналов нет, ничего не сохраняется. После загрузки страницы можно отключиться от интернета — всё продолжит работать. Здесь это важнее, чем кажется: в онлайн-форматтеры вставляют ответы API, конфигурационные файлы и сообщения об ошибках, а в них часто оказываются токены, данные клиентов и внутренние имена хостов.

Что значит «синтаксически корректный» (well-formed)?

Что документ соблюдает правила самого XML: все теги закрыты, вложены в правильном порядке, корневой элемент ровно один, атрибуты в кавычках, а каждый & и < либо экранирован, либо входит в допустимую сущность. Это первый из двух вопросов, которые можно задать о XML. Второй — соответствует ли документ конкретной схеме — отдельный, и эта страница на него не отвечает.

Проверяет ли он по схеме DTD или XSD?

Нет. Здесь проверяется, что документ — синтаксически корректный XML, а именно с такой ошибкой обычно и сталкиваются. Для проверки по схеме нужны ваш файл схемы и валидирующий парсер, а ни один браузер его не содержит; заявлять такую проверку здесь означало бы либо отправлять документ на сервер, либо втихую ничего не проверять. Разницу стоит знать: документ может быть синтаксически безупречным и всё равно не соответствовать своей схеме.

Какие ошибки в XML встречаются чаще всего?

Обычно это одиночный амперсанд — & нужно писать как &amp;, даже внутри URL, поэтому строка запроса, вставленная прямо в элемент, ломает документ. Затем: тег, закрытый в неправильном порядке, два корневых элемента, неопределённая сущность вроде &nbsp; (она есть в HTML, но не в XML) и префикс пространства имён без объявления. Каждая ошибка называется по имени с указанием позиции.

HTML — это корректный XML?

Обычно нет, и это нормально, а не ошибка. HTML допускает незакрытые теги вроде <br> и <li>, атрибуты без кавычек и одиночные амперсанды; XML не допускает ничего из этого. Если нужен HTML, который одновременно является корректным XML, — это XHTML, и в нём должен быть закрыт каждый тег.

Есть ли ограничение по размеру?

Ограничивает доступная память, а не лимит с нашей стороны. Документы в несколько мегабайт форматируются мгновенно; очень большие упираются в то, сколько можно удержать в памяти одновременно, а не в какие-то наши ограничения.

Полезно знать: Проверяется корректность синтаксиса, а не соответствие схеме. Парность тегов, правильная вложенность и допустимые символы проверяются, и вы получаете точную строку и столбец первой ошибки. Проверка по DTD или XSD потребовала бы загрузить их, а сетевых запросов эта страница намеренно не делает.

Разместите этот инструмент на своём сайте

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