Skip to main content

Ошибка XML · entity

Сущность не определена

В XML использована HTML-сущность. Предопределённых всего пять; всё остальное нужно объявлять в DTD или писать числовой ссылкой.

Entity 'nbsp' not defined (line 1)

Что это значит

XML предопределяет ровно пять сущностей: & < > " и '. HTML определяет сотни других —  , ©, —, é — и ни одна из них не существует в XML, пока документ не объявит её сам в DTD.

Это ещё один случай, который пропускают нестрогие парсеры: fast-xml-parser принимает неопределённую сущность без возражений, поэтому   может пройти один инструмент и сломать следующий.

Обычные причины

  • HTML-сущности в содержимом XML:  , ©, —, ….
  • Текст, скопированный из HTML-страницы или визуального редактора в ленту.
  • CMS, которая экранирует для вывода в HTML и применяет то же экранирование к XML.
  • Общий шаблон для HTML- и XML-представления.

Как исправить

  • Используйте числовую ссылку:   вместо  , © вместо ©.
  • Ещё лучше — пишите сам символ: документ в UTF-8, поэтому © и — допустимы буквально.
  • Оборачивайте фрагменты HTML в CDATA, чтобы их сущности не разбирались как XML.
  • Если именованные сущности действительно нужны, объявите их во внутреннем подмножестве DTD.

Та же ошибка в других парсерах

Разные парсеры, один и тот же дефект. Сообщения не переведены — вы искали именно их текст.

  • Xerces (Java)

    The entity "nbsp" was referenced, but not declared.
  • expat (Python)

    undefined entity  : line 1, column 12
  • .NET System.Xml

    Reference to undeclared entity 'nbsp'.
  • fast-xml-parser and similar

    (accepted — no error reported at all)

До и после

Оба фрагмента проверяются тестами на настоящем парсере: первый выдаёт в точности сообщение выше, второй разбирается без ошибок.

Ошибка
<title>Acme&nbsp;Ltd</title>
Разбирается
<title>Acme&#160;Ltd</title>