Skip to main content

Ошибка XML · structure

Несоответствие открывающего и закрывающего тега

Элемент закрыт не в том порядке: парсер встретил закрывающий тег родителя, пока дочерний элемент оставался открытым.

Opening and ending tag mismatch: item line 2 and channel (line 4)

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

Элементы XML должны быть строго вложены друг в друга. Парсер нашёл закрывающий тег, который не совпадает с последним открытым элементом, поэтому дерево документа построить невозможно.

В сообщении две позиции. Первая — «item line 2» — указывает, где был открыт незакрытый элемент, и именно она полезна: ошибка в отсутствующем закрывающем теге там, а не в строке, на которой парсер сдался.

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

  • Пропущен закрывающий тег, поэтому следующий закрывающий тег относится к родителю.
  • Пересекающиеся теги — обычно результат склейки фрагментов шаблона: <a><b></a></b>.
  • Привычки HTML в XML: <br>, <img> или <meta> без самозакрывающей косой черты.
  • Условие в шаблоне, которое выводит открывающий тег только в одной ветке.

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

  • Начните с первой указанной позиции и закройте этот элемент до его родителя.
  • Самозакрывайте пустые элементы: <br/>, а не <br>.
  • Если документ генерируется, собирайте его сериализатором, а не конкатенацией строк.

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

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

  • Xerces (Java)

    The element type "item" must be terminated by the matching end-tag "</item>".
  • expat (Python)

    mismatched tag: line 4, column 2
  • .NET System.Xml

    The 'item' start tag on line 2 position 4 does not match the end tag of 'channel'.
  • Go encoding/xml

    element <item> closed by </channel>

До и после

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

Ошибка
<channel>
  <item>
    <title>First</title>
</channel>
Разбирается
<channel>
  <item>
    <title>First</title>
  </item>
</channel>