Проверить XML
Несовпадающие теги, неопределённые сущности, сломанные пространства имён — найдены и точно указаны встроенным XML-парсером браузера. Ничего не сохраняется.
- Не сохраняется
- Без очереди и ожидания
- Без регистрации и водяных знаков
Вставьте XML — он проверяется по мере ввода.
Как это работает
Вставьте XML
Или перетащите файл. Никуда ничего не отправляется.
Посмотрите результат
Синтаксис корректен — и краткая сводка содержимого. Или точная строка и столбец первой ошибки.
Исправьте и проверьте снова
Правьте прямо на месте — результат обновляется по мере ввода.
Две разные планки — и какая из них проверяется здесь
В 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 встречаются чаще всего?
Обычно это одиночный амперсанд — & нужно писать как &, даже внутри URL, поэтому строка запроса, вставленная прямо в элемент, ломает документ. Затем: тег, закрытый в неправильном порядке, два корневых элемента, неопределённая сущность вроде (она есть в HTML, но не в XML) и префикс пространства имён без объявления. Каждая ошибка называется по имени с указанием позиции.
HTML — это корректный XML?
Обычно нет, и это нормально, а не ошибка. HTML допускает незакрытые теги вроде <br> и <li>, атрибуты без кавычек и одиночные амперсанды; XML не допускает ничего из этого. Если нужен HTML, который одновременно является корректным XML, — это XHTML, и в нём должен быть закрыт каждый тег.
Есть ли ограничение по размеру?
Ограничивает доступная память, а не лимит с нашей стороны. Документы в несколько мегабайт форматируются мгновенно; очень большие упираются в то, сколько можно удержать в памяти одновременно, а не в какие-то наши ограничения.
Полезно знать: Проверяется корректность синтаксиса, а не соответствие схеме. Парность тегов, правильная вложенность и допустимые символы проверяются, и вы получаете точную строку и столбец первой ошибки. Проверка по DTD или XSD потребовала бы загрузить их, а сетевых запросов эта страница намеренно не делает.
Разместите этот инструмент на своём сайте
Бесплатно для любого блога, страницы класса или справочной статьи. Вставьте один фрагмент кода — и посетители смогут пользоваться инструментом прямо на вашей странице.