Есть ли причина, по которой
С философской точки зрения SGML разрешил разрешать </>
закрывать теги. Были дебаты о включении этого в стандарт XML. Причиной отказа было то, что пропуск имен в конечных тегах иногда приводил к снижению читаемости XML. Итак, это «причина, почему».
Трудно превзойти существующие уровни сжатия текста, но одним из преимуществ вашей схемы "сжатия" является то, что XML остается читаемым человеком на проводе. Другое преимущество состоит в том, что если вам нужно вводить XML вручную (например, для тестирования), то (незначительное) удобство - не закрывать конечные теги. То есть, он более доступен для записи , чем стандартный XML. Я говорю «второстепенный», потому что большинство редакторов выполнят для вас завершение строки (например, ^ n и ^ p в vim).
Чтобы убрать закрывающие теги : самое простое - использовать что-то вроде этого: s_</[a-zA-Z0-9_$]+>_</>_
(это неправильное регулярное выражение QName, но вы поняли идею).
Чтобы добавить их обратно : вам нужен специальный анализатор, потому что SAX и другие анализаторы XML не распознают это (так как это не «XML»). Но (самый простой) синтаксический анализ просто должен распознавать имена открытых тегов и имена закрытых тегов.
have a stack.
scan the XML, and output it, as-is.
if you recognize an open tag, push its name.
if you recognize close tag, pop to get its name, and
insert that in the output (you can do this even when there is a proper close tag).
Кстати (в ответ на комментарий выше), это работает, потому что в XML закрывающий тег может соответствовать только самому последнему открытому тегу. То же, что и вложенные скобки.
Однако я думаю, что вы правы, что кто-то наверняка уже сделал это. Может, проверить репозитории Python или Perl?
РЕДАКТИРОВАТЬ: Вы можете дополнительно опустить завершающий </>
, поэтому ваш пример становится (когда анализатор видит EOF, он добавляет закрывающие теги для всего, что осталось в стеке):
<person>
<firstname>Joe</>
<lastname>Plumber